$line1 = aaa bbb ccc ddd xxx yy y;
$line1 = preg_replace('/(\w.+) (\w.+) (\w.+) (\w.+) (\w.+) (\w.+\s+\w)/i', "$1 $2 $3 $4 $5 + str_replace(' ','_', '$6')" , $line1);
echo $myLine1;
我希望输出是
aaa bbb ccc ddd xxx yy_y
但结果是
aaa bbb ccc ddd xxx + str_replace(' ','_', 'yy y')
如果您想对其中一个捕获组进行另一次替换,可以使用 preg_replace_callback。但在这种情况下,您可以只匹配第六次出现后的空格,并将其替换为单个下划线。
解释
^
字符串开头(?:\w+\h+){5}
重复 5 次匹配 1+ 个单词字符和 1+ 个空白字符\w+\K
匹配 1+ 个单词字符并忘记到目前为止匹配的内容\h+
匹配 1 个以上将被替换的水平空白字符(?=\w)
在右侧断言一个单词字符另请注意,您不需要
/i
来进行不区分大小写的匹配,因为 \w
也匹配小写字符。
$line1 = "aaa bbb ccc ddd xxx yy y";
$line1 = preg_replace('/^(?:\w+\h+){5}\w+\K\h+(?=\w)/', "_" , $line1);
echo $line1;
输出
aaa bbb ccc ddd xxx yy_y
查看 PHP 演示 和 regex101 演示。