首页 > 解决方案 > 匹配多个子字符串并连接

问题描述

鉴于我有

KsKd2s4dAs =AhAd2s4dKs =AsAd2s4dKs 5s5d6s6d2c AsAd6s6d2c =AdQdKdJdTd =AhQhKhJhTh =AsQsKsJsTs

我想匹配所有以 '=' 开头的子字符串,并用这个符号连接它们。

输出应该是

KsKd2s4dAs AhAd2s4dKs=AsAd2s4dKs 5s5d6s6d2c AsAd6s6d2c AdQdKdJdTd=AhQhKhJhTh=AsQsKsJsTs

我可以通过使用这个正则表达式来捕获,(=.{10}\s?)+但没有找到一种方便的方法来制作这样的字符串。

标签: phpregex

解决方案


您可以使用

preg_replace('~(?:\G(?!\A)\s+(?==)|(?<!\S)=)(\S+)~', '$1', $text)

请参阅正则表达式演示详情

  • (?:\G(?!\A)\s+(?==)|(?<!\S)=)-=字符串开头的字符或空格之后的字符或前一个匹配的结尾,然后一个或多个空格后跟一个=字符
  • (\S+)- 第 1 组:一个或多个非空白字符。

另一种方法是使用preg_replace_callback

$text = 'KsKd2s4dAs =AhAd2s4dKs =AsAd2s4dKs 5s5d6s6d2c AsAd6s6d2c =AdQdKdJdTd =AhQhKhJhTh =AsQsKsJsTs';
echo preg_replace_callback('~=(\S+(?:\s+=\S+)*)~', function($m) {
    return preg_replace('~\s+~', '', $m[1]);
}, $text);

请参阅PHP 演示正则表达式演示

=(\S+(?:\s+=\S+)*)匹配 a =,然后将任何一个或多个非空白字符捕获到组 1 中,然后将一个或多个空白字符 0 或多个重复,=以及一个或多个非空白字符。


推荐阅读