Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Проблема с регулярными выражениями


Автор: Goliath 12.11.2006, 11:16
Ниже приведен код, который корректно выдирает содержимое в теге <script> в Internet Explorer 6+, но по непонятным для меня причинам не работает в Mozill’e и Oper’e (Как в Oper’e и Mizill’e обозначать перенос строки?). Если кто знает, можете объяснить, буду очень признателен.
Код

var reg = "<script>(.|\n|\t)+<\/script>";
var regexp = new RegExp(reg, "g");
alert(regexp);
                    
var m = regexp.exec(htmlString);
                    
if (m == null) 
{
    alert("No match");

else 
{
    var s = "Match at position " + m.index + ":\n";
    for (i = 0; i < m.length; i++) 
    {
        s = s + m[i] + "\n";
    }
    alert(s);
}

Автор: AKS 12.11.2006, 15:42
Goliath, попробуйте такой регвыр:
Код

 /<(script).*?>(.|[\r\n])*?<\/\1>/gi

Автор: Goliath 12.11.2006, 16:27
Нет, не работает, причем даже в IE 7. Просто, скорее всего, Opera и Mozilla как-то по-другому помечают перенос строки.  Когда я например ввожу строку:
Код

<script>sdfsdf sdfs fs sd</script>
Тогда во все браузерах приведенное мной выражение срабатывает, но как только мне стоит сделать перенос строки:
Код

 <script>sdfsdf 
sdfs fs sd</script>
то регулярка срабатывает только в IE. Есть ли какой-то альтернативный метод указание переноса строки кроме \n?

Автор: AKS 12.11.2006, 16:43
Goliath, у Вас не работает из-за вот этого:
Цитата

var regexp = new RegExp(reg, "g");

Используйте такую переменную:
Код

var regexp = /<(script).*?>(.|[\r\n])*?<\/\1>/gi

Автор: Goliath 12.11.2006, 17:58
Все равно не срабатываетв Oper'e и Mozille. Я сделал так, вариант 100%, проверал:
Код

if (navigator.appName == "Microsoft Internet Explorer")
   var reg = "<script>(.|\n)+<\/script>";
else
   var reg = "<script>(.|\r?\n)+<\/script>";

Автор: 12345c 12.11.2006, 19:12
Код
"gi" - уже теплее, осталось вспомнить про атрибут "m" :)

<textarea id=s1>12345<script>abcdef
   ghijk</script>
</textarea>
<script>onload=function(){
s=document.getElementById('s1').value
alert(s.search(/<(script).*>(.|[\r\n])*<\/\1>/gim))
}</script>

Автор: AKS 12.11.2006, 20:38
12345c
Цитата

"gi" - уже теплее, осталось вспомнить про атрибут "m" smile

Многострочный поиск не нужен. Неужели Вы свой пример не проверили без этого флажка?
В данном случае проблема в синтаксисе - регвыры не так должны выглядеть:
Цитата

var reg = "<script>(.|\n)+<\/script>";

Автор: 12345c 12.11.2006, 21:05
Действительно, без "m" работает; я полагался на мнение высказавшихся экспертов: не работает, значит, есть причина smile

Автор: Goliath 12.11.2006, 21:51
Почему мой вариант не подходить работает стабильно и правильно во всех браузерах! А в опере 9 и мозиле 1.5 
Код

/<(script).*?>(.|[\r\n])*?<\/\1>/gi
, работает не корректно. Да и в IE 7 когда использую \r\n он просто виснет. to AKS спасибо тебе громадное на толкнул на мысль решения проблемы.

Автор: Zeroglif 13.11.2006, 00:31
Цитата(Goliath @  12.11.2006,  11:16 Найти цитируемый пост)
Ниже приведен код, который корректно выдирает содержимое в теге <script> в Internet Explorer 6+ 

Не может такой код корректно выдирать содержимое по определению, хотя бы просто потому, что множитель/квантификатор стоит за скобкой, а не внутри. Соответственно выдираться будет последнее вхождение (символ). Из того, что я вижу, вам нужно:

1. отказаться от конструктора new RegExp() в пользу литеральной записи, иначе придётся разбирать строку, ставить при необходимости двойные обратные слеши и т.п., что вы сейчас не делаете;

2. определиться со способом записи переноса строки в регулярном;

3. правильно расставить скобки, учитывая то, что множитель - это неотъемлемая часть фрагмента;

Приблизительные варианты:

Код

/<script.*?>([\s\S]*?)<\/script>/ig;
/<script.*?>((.|[\r\n])*?)<\/script>/ig;
/<script.*?>((.|\r|\n)*?)<\/script>/ig;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)