Как найти строку, содержащую квадратную скобку? - PullRequest
1 голос
/ 20 июня 2009

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

Найдены все ключевые слова, кроме одного: [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 ]

3 голосов
/ 20 июня 2009

Я думаю, это потому, что [ не является "символом слова", поэтому \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';

Редактировать: Из комментария Дэниела Джеймса:

Это может быть ближе к первоначальному замыслу, так как он по-прежнему будет проверять, что '[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';
1 голос
/ 20 июня 2009

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

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

$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#8

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

...