Обратите внимание, что этот вопрос не касается разбора. Это лексирование. То, что регулярное выражение регулярно и правильно используется.
Если вы хотите пойти с регулярным выражением, вы можете сделать это несколькими способами.
Простой хак опережение как:
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 регулярных выражений):
Я предлагаю получить текстовое содержимое первого затем запустите регулярное выражение. – scunliffe
Возможно, вы захотите проверить форматирование своего вопроса. – Zeta
Я немного потерял то, что вы действительно хотите архивировать. Просьба уточнить вопрос и язык. – TheHippo