我试图匹配可能在字符串中找到的几个单词中的第一个和最后一个字母。我正在使用带有|
.
让我们采用以下字符串:
The quick brown fox jumps over the lazy dog
我想匹配fox
or dog
,所以我做了以下正则表达式:
/fox|dog/
使用 PHP 的preg_replace
,该正则表达式可以正常工作:
$str = 'The quick brown fox jumps over the lazy dog';
echo preg_replace('/fox|dog/', '=>$0<=', $str);
这呼应:
The quick brown =>fox<= jumps over the lazy =>dog<=
这不是我想要的结果。因此,从该正则表达式开始,我尝试对其进行修改,以使结果如下所示:
The quick brown =>f...x<= jumps over the lazy =>d...g<=
我试过这段代码:
$str = 'The quick brown fox jumps over the lazy dog';
echo preg_replace('/(f)o(x)|(d)o(g)/', '=>$1...$2<=', $str);
这没有产生我想要的。这呼应了:
The quick brown =>f...x<= jumps over the lazy =>...<=
经过一番调试,我弄清楚了原因。我想,因为我使用|
它会分别匹配每个单词,但事实并非如此。正如我所想的那样f
是反向引用1
,但d
不是。d
实际上是反向引用3
!这是因为这些组是针对整个正则表达式的,而不仅仅是|
匹配的哪一侧。但是,反向引用0
总是匹配的词(或),所以我有点困惑。fox
dog
如何使用反向引用来匹配多个单词的第一个和最后一个字母?
我找到了使用 的解决方案preg_replace_callback
,但我想知道是否可以使用反向引用获得相同的结果。
$str = 'The quick brown fox jumps over the lazy dog';
echo preg_replace_callback('/fox|dog/', function($matches){
$a = $matches[0];
return '=>'.$a[0].'...'.$a[strlen($a)-1].'<=';
}, $str);