我想将相同的5个重复数字或字母的序列减少到相同的2个重复数字或字母的序列。
即aaaaa => AA
问题:
我不确定要放在preg_replace()
参数中的哪个部分。
示例:
preg_replace('/[a-zA-Z0-9]{5}/','/[a-zA-Z0-9]{2}/',$str);
有关于此的任何想法? :)
答案 0 :(得分:3)
您需要使用捕获组和反向引用:
$str = preg_replace('~([a-zA-Z0-9])\1{4}~', '$1$1', $str);
或
$str = preg_replace('~([a-zA-Z0-9])\1\K\1{3}~', '', $str);
细节模式1:
~ # pattern delimiter
( # open the capture group 1
[a-zA-Z0-9]
) # close the capture group 1
\1{4} # backreference: repeat 4 times the content of the capture group 1
~
在替换字符串$1
中指的是捕获组1的内容。(在模式中为\1
)
第二种模式并没有什么不同,它只使用\K
功能删除匹配结果左侧的所有内容。使用此技巧,您不需要将两个字母放在替换字符串中,因为它们是保留的。只替换最后3个字母。
答案 1 :(得分:0)
这是使用简单字符串函数和基本编程结构的方法:
$str="aaaaa 11111 bbbbb";
for($ascii=32;$ascii<=126;$ascii++) {
$char=chr($ascii);
$charcharcharcharchar=$char . $char . $char . $char . $char;
$charchar=$char . $char;
if(strpos($str, $charcharcharcharchar) !== FALSE) { $str=str_replace($charcharcharcharchar, $charchar, $str); }
}