繁体   English   中英

PHP用更少的字母数替换所有重复的字母

[英]PHP Replace any repeated letters with less number of letters

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

即aaaaa => aa

问题:

我不确定要在preg_replace()参数中放置什么样式。

例:

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

有任何想法吗? :)

您需要使用捕获组和反向引用:

$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个字母。

这是使用简单的字符串函数和基本的编程结构来实现的一种方法:

$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); }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM