【问题标题】:preg_replace() not working for repeating words [duplicate]preg_replace()不适用于重复单词[重复]
【发布时间】:2017-10-10 20:37:42
【问题描述】:

我想在句子或段落中用bye 替换每个出现的hello

$sentence = 'nothello hello hello hello hello hello';
$find = 'hello';
$replace = 'bye';
$str = preg_replace('/(^|[\s])'.$find.'([\s]|$)/', '$1'.$replace.'$2', $sentence);

echo $str;

我希望它回显nothello bye bye bye bye bye,但我却得到nothello bye hello bye hello bye

我做错了什么?

我不能使用\b,因为我使用了很多语言。

*编辑 如果你使用u 标志,我猜\b 可以工作。

【问题讨论】:

  • 这里使用str_replace 而不是preg_replace 试试这个eval.in/792387
  • str_replace .. 试试这个兄弟
  • 您可以使用 \b,因为一旦您使用 unicode u 修饰符,\b 就可以识别 Unicode 并匹配 Unicode 字边界。
  • preg_replace('/\b'.$find.'\b/u', $replace, $sentence); 应该可以工作。据说它从 PHP 5.3.4 开始工作

标签: php regex


【解决方案1】:

这是使用零长度断言的正确位置,称为前瞻和后瞻,而不是匹配:

$str = preg_replace('/(?<=^|\s)'.$find.'(?=\s|$)/', $replace, $sentence);
//=> bye bye bye bye bye

More on lookarounds in regex

(?=...) 是正向前瞻,(?&lt;=...) 是正向后视。

【讨论】:

    【解决方案2】:

    你当前的正则表达式搜索翻译成这样:

    (^|[\s])hello([\s]|$)
    

    将匹配以“hello”开头的字符串——匹配第一个hello。 或字符串“hello”或以“hello”结尾(hello 之前的一个空格),它将匹配第三个和最后一个。

    如果不需要正则表达式搜索/替换,请按照之前的建议使用 str_replace。如果您需要使用正则表达式,请使用像 https://regex101.com/ 这样的正则表达式测试工具/站点来更仔细地测试您的正则表达式。

    【讨论】:

      【解决方案3】:
      $sentence = 'nothello hello hello hello hello hello';
      $find = 'hello';
      $replace = 'bye';
      $str = preg_replace('/(^|[\s])'.$find.'([\s]#i|$)/', '$1'.$replace.'$2', $sentence);
      
      echo $str;
      

      你需要用“#i”来替换整个字符串

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-11
        • 2017-12-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多