JavaScript регулярное выражение: не начинается с - PullRequest
1 голос
/ 04 сентября 2010

Я хочу заменить все вхождения строки, которая не начинается с "<pre>" и не заканчивается на "</pre>".

Итак, скажем, я хотел найти новую-линейные символы и заменить их на «<p/>».Я могу получить часть «не следует»:

var revisedHtml = html.replace(/[\n](?![<][/]pre[>])/g, "<p/>");

Но я не знаю, какую часть «не начинать с» поставить впереди.

Любая помощь, пожалуйста?:)

Ответы [ 3 ]

1 голос
/ 04 сентября 2010

Вот как первая альтернатива взгляда Стива Левитана может быть применена к вашей проблеме:

var output = s.replace(/(<pre>[\s\S]*?<\/pre>)|\n/g, function($0, $1){
    return $1 ? $1 : '<p/>';
});

Когда он достигает элемента <pre>, он захватывает все это и подключает его обратно к выходу. Он никогда не видит новые строки внутри элемента, просто поглощает их вместе со всем остальным содержимым. Таким образом, когда \n в регулярном выражении соответствует совпадению с новой строкой, вы знаете, что оно не находится внутри элемента <pre> и должно быть заменено на <p/>.

Но не делайте ошибку, рассматривая эту технику как хак или обходной путь; Я бы порекомендовал этот подход, даже если бы смотрели . При подходе обходного подхода регулярное выражение должно проверять каждую новую строку и применять обходные пути каждый раз, чтобы увидеть, следует ли ее заменить. Это много ненужной работы, плюс регулярное выражение гораздо более сложное и менее обслуживаемое.

Как всегда при использовании регулярных выражений в HTML, я игнорирую множество факторов, которые могут повлиять на результат, таких как комментарии SGML, секции CDATA, угловые скобки в значениях атрибутов и т. Д. Вам нужно будет определить, какой из этих факторов вам приходится иметь дело в вашем случае, и какие из них вы можете игнорировать. Когда дело доходит до обработки HTML с помощью регулярных выражений, не существует такого понятия, как общее решение.

1 голос
/ 04 сентября 2010

Что вам понадобится, так это отрицательный взгляд за спиной, который является утверждением нулевой длины, которое гарантирует, что какое-то условие не выполнено перед совпадением.К сожалению, Javascript не поддерживает негативные взгляды.Взгляните на этот обходной путь:

Отрицательный взгляд JavaScript Эквивалентный взгляд

0 голосов
/ 04 сентября 2010

Почему бы не сделать обратное.Ищите все подстроки, заключенные в теги <pre>.Затем вы знаете, какие части вашей строки не заключены в <pre>.

РЕДАКТИРОВАТЬ: более элегантное решение: используйте split() и используйте <pre> HTML в качестве разделителей.Это дает вам HTML вне блоков <pre>.

<code>var s = "blah blah<pre>formatted
бла-бла
another formatted
end "; var rgx = /
.*?<\/pre>/g
var nonPreStrings = s.split(rgx);
for (var idx in nonPreStrings)
    alert(nonPreStrings[idx]);
</code>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...