【发布时间】:2011-05-19 09:23:18
【问题描述】:
在 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);
}
我的 REGEX 目前根本无法正常工作,它正在删除一些空格,并且在每次运行时都会在大多数(但不是全部)关键字周围放置更多的花括号。我究竟做错了什么?有人可以纠正我的正则表达式吗?
【问题讨论】:
-
只是一个建议。您可以通过将其放入一个正则表达式并说 ...
(BLOGNAME|BLOGLINK|TITLE|POST|etc)而不是单独检查每个表达式来稍微提高效率。 -
PHP 代码如何知道它正在替换哪个单词?
-
在正则表达式替换的上下文中,当您将表达式放在括号中时,您“捕获”了该表达式所引用的值。然后,您可以使用
$x在替换字符串中引用捕获的值,其中“x”是捕获的表达式的索引,$1 表示第一次捕获,$2 表示第二次,依此类推。示例:preg_replace("/.* Customer#([0-9]+)/", "I captured the number $1", "This is for Customer#1234");将返回“我捕获了数字 1234”。 -
如果您对上面给出的表达式
(BLOGNAME|BLOGLINK|etc)执行相同的操作,那么您可以将捕获的值(您的关键字)引用为替换字符串中的 $1。类似:preg_replace($expression, "{$1}", $string);。您可能需要使用大于 1 的值,具体取决于您选择的表达式正在执行多少次捕获。 -
最新答案显示了如何做到这一点。
标签: php regex regex-negation