使用正则表达式进行搜索和替换

3
我正在尝试通过文本查找特定单词,然后在该单词周围添加HTML标签。例如,如果我有字符串“我去商店买苹果和橙子”,并希望在苹果周围添加HTML粗体标记。

问题是,我用于搜索字符串的单词存储在文本文件中,可以是大写、小写等。当我使用preg_replace进行替换时,我成功地替换了它并添加了标记,但是例如,如果我搜索APPLES并且字符串包含“apples”,它会将格式从apples更改为APPLES,我希望格式保持不变。

我尝试过使用preg_replace,但我找不到保持相同单词大小写的方法。这是我的代码:

foreach($keywords as $value)
    {
        $pattern = "/\b$value\b/i";
        $replacement = "<b>$value</b>";
        $new_string = preg_replace($pattern, $replacement, $string);
    }

所以,如果$value是“APPLES”,那么由于$replacemant中有$value(即“APPLES”),它将把$string中所有大小写格式的“apples”都改成大写。

我如何在保持大小写格式不变的情况下实现这一点,而且不必使用多个循环来处理不同版本的大小写格式?

谢谢

3个回答

2

在替换中,您可以使用文字字符串\0$0代替原样使用$value。 就像\n/$n一样,对于某个整数n,它指的是圆括号的第n个捕获组,\0/$0被扩展为整个匹配。 因此,您应该有:

foreach ($keywords as $value) {
  $new_string = preg_replace("/\\b$value\\b/i", '<b>$0</b>', $string);
}

请注意,'<b>$0</b>' 使用单引号。虽然你也可以使用双引号,因为 $0 并不会被解释为对一个变量的引用,但我认为使用单引号更加清晰明了。在使用双引号的字符串中,你必须小心使用 $,因为通常会得到对现有变量的引用,除非你将 $ 转义为 \$。同样,在模式的双引号内应该转义反斜杠 \b;虽然在这种特定情况下不重要,但在双引号内,反斜杠是一个有意义的字符。

谢谢,这正是我所需要的,非常好用。 - user1658787

0
我可能误解了你的问题,但如果你所困惑的是区分大写字母(APPLE)和小写字母(apple),那么你可以做的第一件事就是将单词转换为大写或小写,并运行测试以找到它并在其周围放置HTML标记。这只是我的猜测,也许我完全误解了问题。

1
在字符串中,apples 可以被设置为 APPLES、aPPles、APPels 等等,我想要搜索单词 apples,无论其格式如何,然后将其替换为相同格式的字符串。我可能有多个不同格式的 apples 实例需要精确搜索,但这可能会导致很多循环来仅更改一个单词。 - user1658787

0
代码中存在离题错误:结果值已被重写在非第一次循环迭代上。而$new_string的最终值将仅是最后一个替换。

正确的做法是 $string = preg_replace($pattern, $replacement, $string);。这段代码只是我用于测试并仅循环了一次,有些误导性。 - user1658787

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接