2013-03-09 7 views
-1

Я хочу найти все совпадения «a» в <span class="get">habbitant morbi</span> triastbbitique, за исключением «a» в тегах (см. Ниже «a» между **).Регулярное выражение в javascript для соответствия за пределами XML-тегов

<span class="get">h*a*bbit*a*nt morbi</span> tri*a*stbbitique.

Если я их найти, я хочу, чтобы заменить их, а также я хочу, чтобы сохранить оригинальные теги.

Это выражение не работает:

var variable = "a"; 
var reg = new RegExp("[^<]."+variable+".[^>]$",'gi'); 
+4

Я предлагаю получить текстовое содержимое первого затем запустите регулярное выражение. – scunliffe

+0

Возможно, вы захотите проверить форматирование своего вопроса. – Zeta

+1

Я немного потерял то, что вы действительно хотите архивировать. Просьба уточнить вопрос и язык. – TheHippo

ответ

2

Обратите внимание, что этот вопрос не касается разбора. Это лексирование. То, что регулярное выражение регулярно и правильно используется.

Если вы хотите пойти с регулярным выражением, вы можете сделать это несколькими способами.

  • Простой хак опережение как:

    a(?![^<>]*>) 
    

    отмечает, что это привычка обращаться < и > цитируемых в тегах/неэкранированный вне тегов правильно.

  • полномасштабная токенизатор формы:

    (expression for tag|comments|etc)|(stuff outside that that i'm interested in) 
    

    Заменено с функцией, которая делает разные вещи в зависимости от того какая часть была подобрана. Если $1 соответствие было бы заменить это сам, если $2 matchehd заменить его *$2*


Полный токенизатор путь, конечно, не является тривиальной задачей, то spec isn't small.

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

var str = '<span class="a <lal> a" attr>habbitant 2 > morbi. 2a < 3a</span> triastbbitique'; 

var re = /(<[a-z\/](?:"[^"]*"|'[^']*'|[^'">]+)*>)|(a)/gi; 

var res = str.replace(re, function(m, tag, a){ 
    return tag ? tag : "*" + a + "*"; 
}); 

Результат:

<span class="a <lal> a" attr>h*a*bbit*a*nt 2 > morbi. 2*a* < 3*a*</span> tri*a*stbbitique 

Это ручки беспорядочные теги, котировки и unescaped </> в HTML.


примеры пару tokenizing HTML тегов с регулярным выражением (который должен перевести штраф JS регулярных выражений):

+0

Спасибо, он работает. – Matt

3

Я бы порекомендовал to not use a regular expression to parse HTML; это не обычная грамматика, и вы испытаете боль для всех, кроме простых случаев.

Ваш вопрос все еще немного неясно, но позвольте мне попробовать перефразировать, чтобы увидеть, если у меня есть это право:

Вы хотели бы, чтобы все матчи заданной строки в HTML-документе, за исключением матчей <tag> органов?


Предполагая, что вы используете JQuery или аналогичные:

// Let the browser parse it for you: 
var container = document.createElement() 
container.innerHTML = '<span class="get">habbitant morbi</span> triastbbitique' 
var doc_text = $(container).text() 

// And then you can just regex away normally: 
doc_text.match(/a/gi) 

(Еще лучше было бы использовать DOMParser, но это не имеет широкой поддержки браузера еще)

Если вы» re в узле, то вы хотите найти некоторые библиотеки, которые помогут вам анализировать узлы HTML (например, jsdom); а затем просто выделите все следующие узлы.

+0

На самом деле это не разбор HTML. Это токенизация HTML, для которого регулярное выражение идеально подходит. – Qtax

+0

Если HTML хорошо написан, обязательно. Но что, если 'variable' включает' <' or '>' и вы хотите найти экземпляры этого в текстовых узлах? Существует множество случаев, когда браузер не будет моргать на необитаемых управляющих символах, подобных этому, и помещать их в текстовые узлы вместо формирования тега. – Nevir

+0

' foo < bar' например. Вы не можете предположить, что кто-то был достаточно хорош для '<', что для вас – Nevir

Смежные вопросы