2010-02-10 2 views
3

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

match <a href="/link/page1">match text</a> 

не будет соответствовать, но

match text 

или

<p>match text</p> 

будут согласованы.

(The «текст матч» будет меняться каждый раз, когда поиск запускается. - Я буду использовать что-то вроде

var tmpStr = new RegExp("\bmatch text\b","g"); 

где значение «текст матча» считывается из базы данных)

До сих пор я прилагаю все усилия для регулярного выражения:

\bmatch text\b(?!</a>) 

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

+0

пред http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/ 1732454 # 1732454 – Will

+0

Извините, избивает вас на 11 секунд. :) – Amber

+0

спасибо за быстрые ответы. Я не думаю, что это одно и то же - я хочу совместить только текст внутри тегов, но не если теги присутствуют (т. Е. Совпадают с текстом, но не текст) - но я думаю, ваше сообщение не должно использовать регулярные выражения для анализа html? – Tomba

ответ

4

Вы можете использовать отрицательный внешний вид-сзади, чтобы получить отверстие <a href=...:

var tmpStr = new RegExp('(?<!<a.*?>)match text(?!</a>)'); 

Надежда, которая работает для вас.

+0

Вы имели в виду "(?! ) текст матча (?!)"? - это именно то, что я искал, большое спасибо – Tomba

+1

Обратите внимание, что это не позволит избежать совпадения, например, 'match text' внутри' test match text foo '. – Amber

+0

@ Dav: Правильно, извините, не так далеко. Хотя это звучит так, как трудно/невозможно обрабатывать каждый случай;) –

3

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

(?!<a.*?>)\bmatch text\b(?!</a>) 
+1

Вы понимаете, что приведенное выше выражение будет соответствовать 'match text', правильно?Фактически, это будет соответствовать любому, где есть пробел или другой текст перед '', потому что '(?! )' буквально ничего не делает - регулярное выражение, которое вы указали выше, * точно совпадает * в функции с «лучшее усилие», размещенное в вашем OP: '\ bmatch text \ b (?!)' - почему? Потому что '(?! ) \ b' идентичен' \ b' - просмотр того, что не является границей слова, а затем границей слова требования, будет соответствовать только границе слова. – Amber

+1

По существу, здесь есть два случая: либо вам нужно совместить 'match text' где-нибудь, кроме того, где это * единственная вещь * внутри ссылки (то есть' match text ', никаких пробелов, никаких других тегов, ничего) - в этом случае ваше регулярное выражение в OP уже отлично работало бы без изменений; или вам нужно сопоставить текст, но только если он не находится внутри ссылки, даже если он заключен в другой текст (т. е. 'match text' * не должен совпадать *), и в этом случае регулярное выражение выше не будет работать. В любом случае, вы ничего не получаете от добавления '(?! ' на передний план. – Amber

+0

@Dav - Спасибо, что объяснили это. Хотя это не очевидно из вопроса, я бы идеально хотел совместить «текст соответствия» где угодно он заключен в теги , есть ли пробелы (в основном, что я хочу сделать, это найти определенную строку, а затем преобразовать ее в ссылку, если она уже не является ссылкой). Однако я могу быть на 99% уверен, что матч будет единственной вещью внутри ссылки, поэтому исходное (OP) регулярное выражение, вероятно, будет работать нормально на практике. – Tomba