2012-04-18 2 views
2

Я пробовал много способов сделать это, единственное, что, кажется, частично делает то, что я хочу, - это отрицательное выражение, описанное в String negation using regular expressions и How to negate specific word in regex?, но я могу 'заставить его работать с моим текущим регулярным выражением.PHP Regex - отрицать совпадение, если оно содержит слово (строка)

Предполагая, что у меня есть эта строка:

[url=http://www.example.com]this url BB tag should match[/url] 
[url=http://www.example.com][spoiler]this url BB tag shouldn't match[/spoiler][/url] 

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

[url=http://www.example.com]Lorem[spoiler]this url BB tag shouldn't match[/spoiler]Ipsum[/url] 

И текущего шаблона регулярного выражения:

#\[url=([\w]+?://.*?)\]([^?\n\r\t].*?)\[/url\]#is 

Редактировать: Я использую следующее регулярное выражение (без # и #is) для его отладки в Regex Buddy:

\[url=([\w]+?://.*?)\]([^?\n\r\t].*?)\[/url\] 

(эти 2 регулярное выражение должно иметь тот же эффект на моем приложении, как я могу легко адаптировать его, поэтому работать с ним, если это имеет смысл)

будет соответствовать обе строки в строке , Я хочу, чтобы он не возвращал совпадение, когда между [url=xxxx://yyyy] и [/url] есть строка [spoiler].

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

Любая помощь приветствуется.

ответ

1

Это должно решить проблему.

'#\[url=([^\]]+)\](?!\[spoiler\])(.*?)\[/url\]#' 
+0

Он по-прежнему возвращает матч для '[URL = HTTP: //www.google.com] [спойлер] [/ спойлер] [/ URL]' на моих PHP и регулярных выражений тестировщиков. –

+0

Вот мой тест 'preg_match ('# \ [url = ([^ \]] +) \] (?! \ [Spoiler \]) (. *?) \ [/ Url \] #', '[url = http://www.google.com] [spoiler] [/ spoiler] [/ url] ', $ m); print_r ($ m); 'Он не возвращает ничего (что вам нужно). – Rezigned

+0

О, извините, для моего комментария выше он фактически не возвращает соответствие вашему регулярному выражению, однако, если я добавлю символ до '[spoiler]', он вернет совпадение: '[url = http: // wwww .google.com] Привет [spoiler] [/ spoiler] [/ url] ' –

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

  • Нет связанных вопросов^_^