Как найти строку, содержащую квадратную скобку?
Я использую регулярное выражение для поиска группы ключевых слов в тексте.
Найдены все ключевые слова, кроме одного: [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);
Спасибо за помощь!
2 ответа
Я думаю это потому что [
не "слово персонажа", так \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';
Редактировать: Из комментария Дэниела Джеймса:
Это может быть ближе к первоначальному замыслу, так как он все равно проверит, что "[Дамба" "не следует за символом слова:
$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';
Первый раздел вашего регулярного выражения - '/ (?! [^<] +>) \ B', поэтому не будет ли он соответствовать "[DAM] Берлинской галерее", если персонаж до этого был '>'?
пытаться:
$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'
Это добавляет модификатор m к вашему регулярному выражению, так что он будет игнорировать новые строки
http://www.phpro.org/tutorials/Introduction-to-PHP-Regex.html
"[Модификатор m] обрабатывает строку как имеющую только один символ новой строки в конце, даже если в нашей строке несколько новых строк".