Регулярное выражение для соответствия ключевому слову, если оно не заключено в фигурные скобки - PullRequest
1 голос
/ 19 мая 2011

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

Какой REGEX мне нужно использовать, чтобы соответствовать только одному ключевому слову, но не совпадать с ним, если оно {KEYWORD}.

Например, текстовая переменная:

$string = "BLOGNAME has posted COUNT new item(s),

TABLE

POSTTIME AUTHORNAME

You received this e-mail because you asked to be notified when new updates are posted.
Best regards,
MYNAME
EMAIL";

А мой код обновления:

$keywords = array('BLOGNAME', 'BLOGLINK', 'TITLE', 'POST', 'POSTTIME', 'TABLE', 'TABLELINKS', 'PERMALINK', 'TINYLINK', 'DATE', 'TIME', 'MYNAME', 'EMAIL', 'AUTHORNAME', 'LINK', 'CATS', 'TAGS', 'COUNT', 'ACTION');
foreach ($keywords as $keyword) {
    $regex = '|(^\{){0,1}(\b' . $keyword . '\b)(^\}){0,1}|';
    $replace = '{' . $keyword . '}';
    $string = preg_replace($regex, $replace, $string);
}

Мой REGEX в настоящее время не работает должным образом, он убирает некоторые пробелы, а также при каждом запуске помещает больше фигурных скобок вокруг большинства (но не всех) ключевых слов. Что я делаю неправильно? Может кто-нибудь исправить мое регулярное выражение?

Ответы [ 3 ]

6 голосов
/ 19 мая 2011

Вы ищете отрицательные утверждения .Они написаны не с использованием синтаксиса ^, как в классах символов, а как (?<!...) и (?!...).В вашем случае:

'|(?<!\{)(\b' . $keyword . '\b)(?!\})|';
2 голосов
/ 19 мая 2011
  • Это будет работать, если ключевое слово не содержит специального символа.
  • (A1) строки могут быть удалены из регулярного выражения, если исходный текст не может содержать {ключевое слово} или необходимо оставить «{}»символы вокруг ключевых слов в тексте результата (было {ключевое слово} необходимо {{ключевое слово}} для форматирования в качестве примера)

$text = <<<EOF
BLOGNAME has posted COUNT new item(s),

TABLE

POSTTIME AUTHORNAME

You received this e-mail because you asked to be notified when new updates are posted.
Best regards,
MYNAME
EMAIL
EOF;

$aKeywords = array('BLOGNAME', 'BLOGLINK', 'TITLE', 'POST', 'POSTTIME', 'TABLE', 'TABLELINKS', 'PERMALINK', 'TINYLINK', 'DATE', 'TIME', 'MYNAME', 'EMAIL', 'AUTHORNAME', 'LINK', 'CATS', 'TAGS', 'COUNT', 'ACTION');
$keywords = implode('|', $aKeywords);

$reSrch = '/
            (?<!\{)             # (A1) prev symbol is not {
            \b                  # begin of word
            ('.$keywords.') # list of keywords
            \b                  # end of word
            (?!\{)              # (A1) next symbol is not {
            /xm';               //  m - multiline search & x - ignore spaces in regex

$reRepl = '{\1}';

$result = preg_replace($reSrch, $reRepl, $text);

echo '<pre>';
// echo '$reSrch:'.$reSrch.'<hr>';
echo $result.'<br>';
1 голос
/ 19 мая 2011

Почему регулярное выражение? Просто используйте str_replace:

foreach ($keywords as $k) {
  $string = str_replace($k, '{'.$k.'}', $string);
}
...