正则表达式匹配关键字,如果没有花括号括起来

时间:2011-05-19 09:23:19

标签: php regex regex-negation

在PHP变量中,我有一些包含一些关键字的文本。这些关键字目前已大写。我希望它们保持大写,并用大括号括起来但只有一次。我正在尝试编写升级代码,但每次运行时,它都会将关键字包装在另一组花括号中。

如果是{KEYWORD},我需要使用什么REGEX来匹配关键字而不匹配它。

例如,文本变量是:

$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 个答案:

答案 0 :(得分:6)

您正在寻找negative assertions。它们不是使用^语法编写的,如字符类,而是(?<!...)(?!...)。在你的情况下:

'|(?<!\{)(\b' . $keyword . '\b)(?!\})|';

答案 1 :(得分:2)

  • 如果关键字不包含特殊字符,它将起作用。
  • (A1)如果源文本不能包含{keyword}或必须在结果文本中的关键字周围留下“{}”符号,则可以从正则表达式中删除行({keyword} need {{keyword}}用于格式化例如)

$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>';

答案 2 :(得分:1)

为何选择正则表达式?只需使用str_replace

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