我需要在字符串中找到最近的名字,我该怎么做?
我得到的最近的是适当的,它发现距离字符串最远的是:
$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 -->
答案 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'的第一个匹配项。
<强>限制强>
每个主题字符串中每个模式的最大可能替换。默认为-1
(无限制)。