2009-06-20 3 views
1

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

Все ключевые слова, которые были найдены, но один: [DAM] Berlin. Я знаю, что он содержит квадратную скобку, поэтому я избежал ее, но все равно не повезло. Что я делаю не так?

вот мой код php.

Текст для поиска по ключевым словам:

$textToSearch= '<p><br> 
Time ¦ emit LAb[au] <br> 
<br> 
[DAM]Berlin gallery<br> 
<br> 
Exhibition: February 21st - March 28th, 2009 <br> 
<br> 
Opening: Friday, February 20th, 2009 7-9 pm <br>'; 

Регулярное выражение:

$find='/(?![^<]+>)\b(generative art console|Game of Life|framework notations|framework|Floating numbers|factorial|f5x5x3|f5x5x1|eversion|A-plus|16n|\[DAM\]Berlin gallery)\b/s'; 

заменить функцию обратного вызова:

function replaceCallback($match) 
{ 
     if (is_array($match)) 
     { 
     $htmlVersion = htmlspecialchars($match[1], ENT_COMPAT, 'UTF-8'); 
     $urlVersion = urlencode($match[1]); 
     return '<a class="tag" rel="tag-definition" title="Click to know more about ' . $htmlVersion . '" href="?tag=' . $urlVersion. '">'. $htmlVersion . '</a>'; 
     } 
     return $match; 
} 

и, наконец, вызов:

$tagged_content = preg_replace_callback($find, 'replaceCallback', $textToSearch); 

Благодарим за помощь!

ответ

3

Я думаю, это потому, что [ не является «символом слова», так \b[ может не совпадать [ в начале [DAM]Berlin. Вы, вероятно, нужно изменить регулярное выражение:

$find='/(?![^<]+>)(\b(?:generative art console|Game of Life|framework notations|framework|Floating numbers|factorial|f5x5x3|f5x5x1|eversion|A-plus|16n)|\[DAM\]Berlin gallery)\b/s'; 

Edit: Из комментария Daniel Джеймс:

Это может быть ближе к первоначальной цели, так как он все равно будет проверять, что " [Dam] не следует слово характер:

$find='/(?![^<]+>)(?<!\w)(generative art console|Game of Life|framework notations|framework|Floating numbers|factorial|f5x5x3|f5x5x1|eversion|A-plus|16n|\[DAM\]Berlin gallery)\b/s'; 
+0

Я попробовал ваше предложение, однако php возвращает предупреждение. Есть ли альтернатива флагову b? вот предупреждение: preg_replace_callback(): Ошибка компиляции: совпадающие скобки при смещении 166 – pixeline

+2

Удалите закрытие parenthese в конце \ b)/s (этот) – jitter

+2

Это может быть ближе к исходному намерению, так как оно будет все еще проверяйте, что «[Dam]» не следует за символом слова: $ find = '/ (?! [^ <]+>) (?

1

Первый раздел вашего Regex есть '/ (?! [^ <] +>) \ b', так что не только он будет соответствовать галереям «[DAM] Berlin», если персонаж перед ним был «>»?

попробовать:

$find='/(?![^<]+>)\b(generative art console|Game of Life|framework notations|framework|Floating numbers|factorial|f5x5x3|f5x5x1|eversion|A-plus|16n|\[DAM\]Berlin gallery)\b/sm' 

Это добавляет модификатор м к вашему регулярному выражению так, что он будет игнорировать новые линии

http://www.phpro.org/tutorials/Introduction-to-PHP-Regex.html#8

«[М модификатор] рассматривает строку как имеющие только символ новой строки в конце, , даже если в нашей строке есть несколько новых строк . "

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