preg_replace() 特定字符串的一部分,将空格替换为下划线

问题描述 投票:0回答:1
$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')
php string replace preg-replace
1个回答
0
投票

如果您想对其中一个捕获组进行另一次替换,可以使用 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 演示

© www.soinside.com 2019 - 2024. All rights reserved.