PHP用少量字母替换任何重复的字母

时间:2014-11-26 19:08:32

标签: php regex preg-replace

我想将相同的5个重复数字或字母的序列减少到相同的2个重复数字或字母的序列。

  

即aaaaa => AA

问题:

我不确定要放在preg_replace()参数中的哪个部分。

示例:

preg_replace('/[a-zA-Z0-9]{5}/','/[a-zA-Z0-9]{2}/',$str);

有关于此的任何想法? :)

2 个答案:

答案 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); }
}