php - 匹配多个子字符串并连接
问题描述
鉴于我有
KsKd2s4dAs =AhAd2s4dKs =AsAd2s4dKs 5s5d6s6d2c AsAd6s6d2c =AdQdKdJdTd =AhQhKhJhTh =AsQsKsJsTs
我想匹配所有以 '=' 开头的子字符串,并用这个符号连接它们。
输出应该是
KsKd2s4dAs AhAd2s4dKs=AsAd2s4dKs 5s5d6s6d2c AsAd6s6d2c AdQdKdJdTd=AhQhKhJhTh=AsQsKsJsTs
我可以通过使用这个正则表达式来捕获,(=.{10}\s?)+
但没有找到一种方便的方法来制作这样的字符串。
解决方案
您可以使用
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);
=(\S+(?:\s+=\S+)*)
匹配 a =
,然后将任何一个或多个非空白字符捕获到组 1 中,然后将一个或多个空白字符 0 或多个重复,=
以及一个或多个非空白字符。
推荐阅读
- for-loop - 在循环上需要帮助以使用 awk 平均成绩。输出为每个学生打印相同的成绩
- git-bash - 尽管目录存在并且我似乎有写权限,但 mkdir 失败
- woocommerce - 从属性中获取所有变体
- mysql - 查询 mysql 加入两个表并显示第二个的特定表
- ssl - 当 ISP 阻止端口 80 和 443 时,如何为我的私人服务器使用 Let's Encrypt?
- php - Auth 在 Laravel 的中间件中不起作用
- x86 - 在最近的英特尔上,拆分行/页面存储是否需要两个存储缓冲区条目?
- javascript - 显示/隐藏脚本在第一次单击时不起作用,但在之后起作用
- python - TypeError:需要一个整数(获取类型元组)日期时间 Python
- c# - 控制台应用程序的打印方式与在线编译器不同