Javascript RegEx не будет работать, но работает на C # (атомарное подвыражение) - PullRequest
1 голос
/ 16 августа 2010

У меня есть регулярное выражение, проверенное в Expresso, работает как шарм.Но когда я пытаюсь использовать его в JavaScript, это выдает ошибку.Firebug говорит:

invalid quantifier ?><div\b[^>]*>(?<DEPTH>)|<\/div>(?<-DEPTH>)|.?)*(?(DEPTH)(?!))<\/div>

регулярное выражение:

<div\b[^>]*>(?><div\b[^>]*>(?<DEPTH>)|</div>(?<-DEPTH>)|.?)*(?(DEPTH)(?!))</div>

Регулярное выражение соответствует вложенным html-divам, таким как:

<div id="foo"><div>blubb</div><div foobar>blubb</div></div>

Является ли регулярное выражение JavaScript только подмножеством?

edit: я должен убрать div, включая текст между ними, подальше.

<div id="foo"><div>blubb</div><div foobar>blubb</div></div>some
non html...

должен остаться только "некоторый не HTML ...".Так что я думаю, что не могу использовать htmlparser?

Ответы [ 2 ]

4 голосов
/ 16 августа 2010

Является ли регулярное выражение javascript только подмножеством?

Нет, они отличаются - существует множество механизмов регулярных выражений, и каждый из них имеетразличные особенности / причуды.

C # имеет больше возможностей, чем JavaScript, но один из JS не является производным от C #, поэтому он не является подмножеством.

Вот пара страниц, которые документируют различия:

И весь этот веб-сайт ( регулярные-регулярные выражения.info ) стоит посетить, чтобы узнать больше о регулярных выражениях.

Регулярное выражение соответствует вложенным html-divs

Вероятно, не во всех случаях.

И, конечно, это не будет возможно дляодиночное регулярное выражение JS, поскольку, помимо прочего, оно не поддерживает такие вещи глубины.

Вы используете не тот инструмент для этой работы - синтаксический анализ HTML должен выполняться с помощью правильного анализатора / селектора HTML, а затем анализDOM, чтобы найти вложенные div.

Все, что реализует Sizzle , должно делать (то есть jQuery , Dojo Toolkit и другие).

Например, что-то вроде jQuery('div:has(div)') или dojo.query('div:has(div)') или аналогичное должно найти вложенные элементы div (т. Е. Выбрать все элементы div, в которые вложен элемент div) и корректно справится с различными причудами, которые могут быть сложными, еслиневозможно с помощью одного регулярного выражения.

edit: я должен убрать div, включая текст между ними, прочь.
<div id="foo"><div>blubb</div><div foobar>blubb</div></div>some non html...
должен остаться только "некоторый не html ...".Так что я думаю, что не могу использовать htmlparser?

Нет - это еще одна причина использовать парсер HTML, а не пытаться взламывать бесполезные регулярные выражения.

jQuery('#foo div').remove()

Это удалит все дочерние DIV и оставит текстовый узел HTML на месте.

В зависимости от ваших точных требований, селектор может потребоваться изменить, но это абсолютно непростая задача для инструмента, предназначенного для понимания HTML.

1 голос
/ 16 августа 2010

Конечно, сегодняшний javascript не будет поддерживать атомарную группу и рекурсивное регулярное выражение, но вы можете легко создать быстрое и грязное решение путем кусочно-рекурсивного извлечения тегов из HTML-источника. Если другие решения слишком сложны и структура документов предсказуема, вы можете сделать это. как:

 function stripme(tag, code)
{
 var strp = code;
 var regexp = new RegExp('<'+tag+'[^>]*?>(.*)</'+tag+'>');  // <- involves backtracking 
 while( strp.match(regexp) )            // every level of nesting will lead to
    strp = strp.replace(regexp, '');    // another loop invocation with the captured
 return strp;                           // contents (.*) of the level in RegExp.$1
}                                       // (if needed) 

Это будет работать, например:

 var html ='<div id="foo"><div>blubb</div><div foobar>blubb</div></div>some non html...';

при вызове, например ::

 window.onload = function() { var stripped=stripme('div', html); alert(stripped); }

Кстати, , если возможно , всегда используйте парсер DOM или библиотеку Javascript в соответствии с рекомендациями Peter Boughton

Привет

БВУ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...