Regex заменить строку, но не внутри HTML-тега - PullRequest
5 голосов
/ 21 июля 2009

Я хочу заменить строку на странице HTML, используя JavaScript, но игнорирую ее, если она есть в теге 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...

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

Ответы [ 8 ]

6 голосов
/ 21 июля 2009

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

5 голосов
/ 21 июля 2009

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

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

1 голос
/ 29 января 2010

* Временное решение 1002 *

Если вы не можете использовать 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
 }
});
1 голос
/ 14 сентября 2009
1 голос
/ 21 июля 2009

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

Подробнее см. этот вопрос Stackoverflow (и ответы).

1 голос
/ 21 июля 2009

вы действительно не можете этого сделать, ваш "гугл" всегда в каком-то теге, либо заменить все, либо ничего

0 голосов
/ 22 ноября 2010

Это можно сделать с помощью REGEX, но для фильтрации таких блоков, как STYLE, SCRIPT и CDATA, потребуется больше работы, и они не реализованы в следующем решении.

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

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

0 голосов
/ 21 июля 2009

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

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