Php 如果没有用大括号括起来,则要匹配关键字的正则表达式

Php 如果没有用大括号括起来,则要匹配关键字的正则表达式,php,regex,regex-negation,Php,Regex,Regex Negation,在PHP变量中,我有一些包含一些关键字的文本。这些关键字目前已大写。我希望它们保持资本化,并用花括号括起来,但只放一次。我试图编写升级代码,但每次运行时,它都会将关键字放在另一组花括号中 如果关键字为{keyword},我需要使用什么正则表达式单独匹配关键字而不匹配它 例如,文本变量为: $string = "BLOGNAME has posted COUNT new item(s), TABLE POSTTIME AUTHORNAME You received this e-mail b

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

如果关键字为{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);
}

我的正则表达式目前一点也不好用,它去掉了一些空格,并且在每次运行时都会在大多数(但不是全部)关键字周围放置更多的花括号。我做错了什么?有人能纠正我的正则表达式吗

为什么是正则表达式?只需使用
str\u replace

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

为什么是正则表达式?只需使用
str\u replace

foreach ($keywords as $k) {
  $string = str_replace($k, '{'.$k.'}', $string);
}
你在找我。它们不是使用字符类中的
^
语法编写的,而是使用
(?和
(?!…)
。在您的情况下:

'|(?<!\{)(\b' . $keyword . '\b)(?!\})|';
您正在查找的
”|(?。它们不是使用字符类中的
^
语法编写的,而是使用
(?和
(?!…)
。在您的情况下:

'|(?<!\{)(\b' . $keyword . '\b)(?!\})|';
”|(?
  • 如果关键字不包含特殊字符,它将起作用
  • (A1)如果源文本不能包含{keyword}或需要在结果文本中的关键字周围保留{}符号,则可以从正则表达式中删除行(例如,was{keyword}需要{keyword}进行格式化)

$text=
  • 如果关键字不包含特殊字符,它将起作用
  • (A1)如果源文本不能包含{keyword}或需要在结果文本中的关键字周围保留{}符号,则可以从正则表达式中删除行(例如,was{keyword}需要{keyword}进行格式化)



$text=因为如果你有重叠的键,它就不能正常工作。
stru replace(“POST”、“{POST}”、“string”)
会将
{POSTTIME}
变成
{{POST}TIME}
,这是不好的。啊,对。如果你给
$k
添加空格,就像
“$k”
?嗯,当关键字位于字符串的开头或结尾时,它将不匹配。呸。你知道了。正则表达式经常被误用和邪恶,但在这里它们是合理的(即使预期用途有点奇怪):)@Jeff,当你说用法有点奇怪时,你是否认为有更好的方法?我洗耳恭听!不,只是在已经定义的关键字上添加大括号似乎有点毫无意义。显然,你会用实际值替换这些值,但在这种情况下,为什么还要费心加大括号?因为如果你有ov,它将无法正常工作erlapping键。
str_replace(“POST”、“{POST}”、$string);
会将
{POSTTIME}
变成
{POST}TIME}
,这是不好的。啊,对。如果你给
$k
添加空格,就像
“$k”
?嗯,当关键字位于字符串的开头或结尾时,它将不匹配。呸。你知道了。正则表达式经常被误用和邪恶,但在这里它们是合理的(即使预期用途有点奇怪):)@Jeff,当你说用法有点奇怪时,你是否认为有更好的方法?我洗耳恭听!不,只是在已经定义的关键字上添加大括号似乎有点毫无意义。显然,你会用实际值替换这些值,但在这种情况下,为什么还要加大括号呢?只是一个建议。你也许可以改进通过将其放入一个正则表达式并说…
(BLOGNAME | BLOGLINK | TITLE | POST |等)来稍微提高效率
而不是逐个检查。PHP代码如何知道它正在替换哪个词?在正则表达式替换的上下文中,当您将表达式放在括号中时,您可以“捕获”该表达式所引用的值。然后可以使用
$x
在替换字符串中引用捕获的值,其中“x”is是捕获表达式的索引,$1表示第一次捕获,$2表示第二次捕获,依此类推。例如:
preg#u replace(/.*Customer#([0-9]+)/“,“I captured the number$1”,“This is is for Customer#1234”)
将返回“I captured the number 1234”。如果对上述表达式执行相同的操作
(BLOGNAME | BLOGLINK等)
,然后您可以在替换字符串中将捕获的值(您的关键字)引用为$1
。您可能需要使用大于1的值,具体取决于所选表达式的捕获数量。最新的答案显示了如何执行此操作。只是一个建议。您可以通过将其放入一个正则表达式并说……
(BLOGNAME | BLOGLINK | TITLE | POST |等)来稍微提高效率
而不是逐个检查。PHP代码如何知道它正在替换哪个词?在正则表达式替换的上下文中,当您将表达式放在括号中时,您可以“捕获”该表达式所引用的值。然后可以使用
$x
在替换字符串中引用捕获的值,其中“x”is是捕获表达式的索引,$1表示第一次捕获,$2表示第二次捕获,依此类推。例如:
preg#u replace(/.*Customer#([0-9]+)/“,“I captured the number$1”,“This is is for Customer#1234”)
将返回“I captured the number 1234”。如果对上述表达式执行相同的操作
(BLOGNAME | BLOGLINK等)
,然后您可以在替换字符串中将捕获的值(您的关键字)引用为$1
。您可能需要使用大于1的值,具体取决于所选表达式的捕获数量。最新的答案显示了如何实现此目的。最初无法实现此目的,但这必须由我来完成,因为我现在已经实现了。因为我的原始代码将循环使用18个关键字,并执行6个preg_替换