使用PHP preg_replace()的正则表达式需要在字符串

时间:2016-02-03 18:10:51

标签: php regex preg-replace

我需要在字符串中找到最近的名字,我该怎么做?

我得到的最近的是适当的,它发现距离字符串最远的是:

$string = "joe,bob,luis,sancho,bob,marco,lura,hannah,bob,marco,luis";

$new_string = preg_replace('/(bob(?!.*bob))/', 'found it!', $string);

echo $new_string;
<!-- outputs: joe,bob,luis,sancho,bob,marco,lura,hannah,found it!,marco,luis -->

我该如何做到适合?并有这样的输出:

<!-- outputs: joe,found it!,luis,sancho,bob,marco,lura,hannah,bob,marco,luis -->

2 个答案:

答案 0 :(得分:1)

您可以尝试使用负面的lookbehind,例如

$string = "joe,bob,luis,sancho,bob,marco,lura,hannah,bob,marco,luis";

$new_string = preg_replace('/((?<!bob)bob)/', 'found it!', $string, 1);

echo $new_string;
<!-- outputs: joe,found it!,luis,sancho,bob,marco,lura,hannah,bob,marco,luisoff -->

正如Wiktor所说,使用limit选项仅匹配名称的第一个匹配项。

答案 1 :(得分:0)

您正在使用的正则表达式(bob(?!.*bob))匹配最后一次出现的bob(而不是整个单词),因为.匹配任何字符而不是换行符,并且否定前瞻确保bob之后没有bob。请参阅what your regex matches(如果我们使用默认选项preg_replace)。

您可以使用

$re = '/\bbob\b/'; 
$str = "joe,bob,luis,sancho,bob,marco,lura,hannah,bob,marco,luis"; 
$result = preg_replace($re, 'found it!', $str, 1);

请参阅IDEONE demo

正则表达式\bbob\b将匹配整个单词,并且使用limit参数将仅匹配单词'bob'的第一个匹配项。

请参阅preg_replace help

  

<强>限制
  每个主题字符串中每个模式的最大可能替换。默认为-1(无限制)。