сложная функция html string.replace - PullRequest
0 голосов
/ 21 ноября 2010

У меня есть очень простой HTML, который генерируется из базы данных jSon строк, как это:

"<div style=\"padding-top:59px;\"><a href=\"http://www.macm.org/en/index.html\"><img src=\"http://www.artimap.com/montreal/www.macm.org.jpg\"><br>www.macm.org/en/index.html</a><h1>Musée d'art contemporain de Montréal</h1><p></p><p>A major Canadian institution dedicated exclusively to contemporary art, the Musée offers a varied program ranging from presentations of its Permanent Collection to exhibitions of works by Québec, Canadian and international artists. The Permanent Collection comprises some 7,000 works, including the largest collection of art by Paul-Émile Borduas.</p><div><p>185, Sainte-Catherine West (corner Jeanne-Mance)</p><p>H2X 3X5</p></div><b>514 847-6226</b></div>"

И переменная RESULTS, которая представляет собой конкатенацию таких строк, еще одна переменная: searchterm, которая является поисковым термином. Я хочу заключить каждый случай поиска в результатах с помощью HTMl searchterm Я использую эти регулярные выражения и функции для каждого тега, в котором я заинтересован, например:

var REG=new RegExp(searchterm,'gmi');
var regFUN=function(x){return x.replace(REG,"<i>$&</i>");};
var reg = new RegExp('<p>(.*?)</p>','gmi');
RESULTSshow=RESULTSshow.replace(reg,regFUN);
(I do this for every tags I am interested in highlighting) 
This does <i>"searchterm"</i> but also gives <<i>p</i>> if searchterm==="p" wich really bugs me for the two last days.

Проблема в том, что если searchterm равен "p", это не только изменит текст внутри тегов, но также изменит сам тег.

Как я могу остановить его от изменения тегов? Я действительно хочу сделать это с помощью regExp, а не перебирать html (dom) ради скорости.

Ответы [ 2 ]

1 голос
/ 22 ноября 2010

Теперь используйте этот замечательный маленький RegExp вместо слишком сложного первого:

REG=new RegExp("(?![^<>]*>)("+searchterm+")","gi");
RESULTSshow=RESULTSshow.replace(REG,'<i>$1</i>');
0 голосов
/ 22 ноября 2010

Что ж, учитывая, что ваш HTML не содержит блоков, таких как SCRIPT, CDATA, STYLE, это возможно с помощью регулярного выражения с использованием lookahead:

text = text.replace(/(?![^<>]*>)old/g, 'new');

Хотя я бы использовал легкий синтаксический анализатор или доморощенныйодин, не беспокоясь о скорости для лучшей поддержки.Обратите внимание, что вам нужно обработать источник, если ваши атрибуты могут содержать <> символов.

Попробуйте это:

<html>
<head>
<script>
function t() {
    text = "<html><head></head><body><p>SuperDuck</p><p>Jumps over the lazy dog</p></body></html>";
    a = text.replace(/(?![^<>]*>)(p)/g, '<i>$1</i>');
    alert (a);
}
</script>
</head>
<body>
    <button onclick="t();">hit me!</button>
</body>
</html>

Просто замените (p) в строке замены, и выготовы перепрыгнуть =)

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