2009-07-21 2 views
5

Я хочу, чтобы заменить строку в HTML-страницы с помощью JavaScript, но игнорировать его, если он находится в HTML-тег, например:Regex заменить строку, но не внутри HTML тега

<a href="google.com">visit google search engine</a> 
you can search on google tatatata... 

Я хочу заменить google на <b>google</b>, но не здесь:

<a href="google.com">visit google search engine</a> 
you can search on <b>google</b> tatatata... 

Я пытался с этим:

regex = new RegExp(">([^<]*)?(google)([^>]*)?<", 'i'); 
el.innerHTML = el.innerHTML.replace(regex,'>$1<b>$2</b>$3<'); 

но проблема: я получил <b>google</b> внутри <a> тег:

<a href="google.com">visit <b>google</b> search engine</a> 
you can search on <b>google</b> tatatata... 

Как можно это исправить?

ответ

6

Для этого вам лучше использовать синтаксический анализатор html, а не регулярное выражение. Я не уверен, что это можно сделать на 100% надежно.

1

вы не можете сделать это, ваш «Google» всегда в какой-то тег, либо заменить все или ни

5

Вы можете или не можете быть в состоянии сделать с с регулярным выражением. Это зависит от того, насколько точно вы можете определить условия. Утверждение, что вы хотите заменить строку, за исключением случаев, когда она находится в теге HTML, недостаточно узкая, поскольку все на странице, по-видимому, находится внутри некоторого HTML-тега (BODY, если ничего другого).

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

+1

Я согласен. Найдите все текстовые узлы в DOM, содержащие строку. Храните черный список тегов, которые вы ** не ** хотите заменить строку. Проверьте, находится ли текстовый узел внутри одного из этих тегов. Если нет, сделайте свою замену, иначе оставьте ее как есть. – tvanfosson

1

Разбор HTML с регулярным выражением не будет легким ни для чего, кроме тривиальных случаев, так как HTML не является регулярным.

Для получения дополнительной информации см. this Stackoverflow question (и ответы).

0

Ну, поскольку все является частью тега, ваш запрос не имеет никакого смысла. Если это всего лишь тег <a />, вы можете просто проверить эту часть. Главным образом, убедившись, что вы не имеете хвостохранилища </a> тег перед свежей <a>

1

Я думаю, что вы все не хватает вопрос здесь ...

Когда он говорит, что внутри тега, он означает, что внутри отверстия тег, как и в < A HREF = "google.com" > тег ... Это нечто совсем иное, чем текст, скажем, внутри < р > </р > тег пары или < тела > </тело >. Пока у меня пока нет ответа, я борюсь с этой же проблемой, и я знаю, что ее нужно разрешать с помощью регулярного выражения. Как только я это выясню, я вернусь и отправлю.

1

РЕШЕНИЕ

Если Вы не можете использовать HTML-парсер или вполне уверены в своей структуре HTML попробовать это:

  1. сделать "плохо" меняется
  2. повторить замену (< [^>] *) (< [^>] +>) до 1 долл. США в несколько раз (столько, сколько вам нужно)

Это простой обходной путь, но работает для меня.

Против? Ну ... Вы должны сделать дважды заменить в случае ... ...> как это удаляет только первый нежелательный тег из каждого тега на странице

[редактировать]: РЕШЕНИЕ

Почему бы не использовать JQuery, поставить HTML код на страницу и сделать что-то вроде этого:

$(containerOrSth).find('a').each(function(){ 
if($(this).children().length==0){ 
$(this).text($(this).text().replace('google','evil')); 
}else{ 
//here You have to care about children tags, but You have to know where to expect them - before or after text. comment for more help 
} 
}); 
+0

Другое дело, что это не парсер. – BalusC

+1

Эй, я сказал: «Если вы не можете использовать парсер» - так что да, это не – naugtur

0

Вы можете сделать это с помощью Regex, но фильтрующие блоки, как стиль, SCRIPT и CDATA будет нужно больше работать, а не реализован в следующем решении.

В большинстве ответов указано, что «ваши данные всегда находятся в некоторых тегах», но им не хватает точки, данные всегда «между» некоторыми тегами, и вы хотите отфильтровать там, где она находится в теге.

Обратите внимание, что символы тегов в встроенных сценариях, вероятно, нарушают это, поэтому, если они существуют, они должны обрабатываться отдельно этим методом. Посмотрите здесь:
complex html string.replace function

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