【问题标题】:Search and Replace with Regex使用正则表达式搜索和替换
【发布时间】:2012-09-09 23:08:48
【问题描述】:

我正在尝试在文本中搜索特定单词,然后在该单词周围添加一个 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,它会将 $string 中苹果的每个大小写格式更改为大写,因为 $replacemant 中包含 $value,即“APPLES”。

如何在 case 格式保持不变且不必使用不同版本的 case 格式执行多个循环的情况下实现这一点?

谢谢

【问题讨论】:

    标签: php regex


    【解决方案1】:

    您可以使用文字字符串\0$0,而不是在替换中逐字使用$value。正如\n/$n,对于某个整数n,指回nth 括号捕获组,\0/$0 被扩展为整个匹配。因此,你会有

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

    请注意,'&lt;b&gt;$0&lt;/b&gt;' 使用单引号。您可以在这里使用双引号,因为$0 不会被解释为对变量的引用,但我认为这更清楚。通常,在双引号字符串中使用$ 时必须小心,因为除非您将$ 转义为\$,否则您通常会获得对现有变量的引用。同样,您应该在模式的双引号内转义 \b 中的反斜杠;尽管在这种特定情况下无关紧要,但通常反斜杠是双引号中的一个有意义的字符。

    【讨论】:

    • 谢谢,这正是我想要的,就像一个魅力。
    【解决方案2】:

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

    【讨论】:

    • 在字符串中,apples 可以设置为 APPLES、aPPles、APPels 等,我想搜索单词 apples,无论其格式如何,然后在替换它的字符串中保持其相同的格式。我可以有多个不同格式的苹果实例并精确搜索,但这可能导致许多循环只改变一个词。
    【解决方案3】:

    代码中存在offtopic错误:结果值已在非第一次循环迭代时被重写。 $new_string 的结束值将只是最后一个替换。

    【讨论】:

    • 正确,误导,因为这只是我用于测试和循环一次的部分代码。真的应该是 $string = preg_replace($pattern, $replacement, $string);当前格式
    猜你喜欢
    • 2013-06-14
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 2010-11-25
    • 2010-10-30
    • 1970-01-01
    相关资源
    最近更新 更多