【问题标题】:PHP - Need to remove duplicate characters within a String but would like to include exceptionsPHP - 需要删除字符串中的重复字符,但希望包含异常
【发布时间】:2012-06-01 10:46:03
【问题描述】:

我一直在互联网上搜索解决方案,但找不到。

我需要删除字符串中的重复字符,但还想包含一个例外以允许整数数量的字符重复/保留在字符串中。

例如,我尝试了以下操作:

$str = 'This ----------is******** a bbbb 999-999-9999 ******** 8888888888 test 4444444444 ********##########Sammy!!!!!! ###### hello !!!!!!';

$t1 = preg_replace('/(.)\1{3,}/','',$str);
$t2 = preg_replace('/(\S)\1{3,}/','',$str);
$t3 = preg_replace('{(.)\1+}','$1',$str);
$t4 = preg_replace("/[;,:\s]+/",',',$str);
$t5 = preg_replace('/\W/', '', $str);
$t6 = preg_replace( "/[^a-z]/i", "", $str);

echo '$t1 = '.$t1.'<br>';
echo '$t2 = '.$t2.'<br>';
echo '$t3 = '.$t3.'<br>';
echo '$t4 = '.$t4.'<br>';
echo '$t5 = '.$t5.'<br>';
echo '$t6 = '.$t6.'<br>';

结果:

$t1 = This is a 999-999- test Sammy hello 
$t2 = This is a 999-999- test Sammy hello 
$t3 = This -is* a b 9-9-9 * 8 test 4 *#Samy! # helo !
$t4 = This,----------is********,a,bbbb,999-999-9999,********,8888888888,test,4444444444,********##########Sammy!!!!!!,######,hello,!!!!!!
$t5 = Thisisabbbb99999999998888888888test4444444444Sammyhello
$t6 = ThisisabbbbtestSammyhello

期望的输出是:

This ---is*** a bbbb 999-999-9999 *** 8888888888 test 4444444444 ***###Sammy!!! ### hello !!!

如您所见,desired 输出只留下数字,只留下 3 个重复字符,即 --- ### * !!!

如果可能,我希望能够将异常从 3 更改为任何其他整数。

提前致谢。

【问题讨论】:

  • /([^0-9])\1{3,}?如果要允许数字重复,则从重复检查中排除数字。
  • 谢谢,但是如何编写整个 preg_replace 语句来合并它呢?

标签: php string preg-replace duplicates


【解决方案1】:

这样就可以了:

preg_replace('/(([^\d])\2\2)\2+/', '$1', $str);

[^\d] 匹配不是数字的单个字符。
\2 指的是捕获的数字
$1 指的是第一个捕获的组,它将是前三个重复字符,所以多余的\2+ 被剥离。

Codepad

【讨论】:

  • 如果我想保留4个重复的字符,我会不会把所有的2都改成3等等?我尝试使用 3,但没有用。
  • @Sammy 不,\2 指的是第二组括号捕获的数字(匹配[^\d] 的字符。要保留4 个字符,您可以将\2\2 更改为\2\2\2。这将保留一个额外的字符,一旦你有那么多,尽管最好将其更改为 \2{3},这是 \2 的简写三次。IE.\2{5}\2\2\2\2\2 的简写
  • 嗯,这行不通。我使用不同的正则表达式来解决问题: preg_replace('{([^\w])\1+}','',$str);
【解决方案2】:

您正在寻找的正则表达式:/((.)\2{2})\2*/ 如果您需要异常n,请将n-1 放在大括号{n-1}/((.)\2{n-1})\2*/

编辑:对于非数字或任何你什么,将. 替换为其他内容,例如[^\d]/(([^\d])\2{2})\2*/

【讨论】:

  • 我忘了补充,你必须捕获$1
猜你喜欢
  • 2021-01-13
  • 2015-08-06
  • 2016-07-16
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 2012-11-14
  • 2016-06-29
相关资源
最近更新 更多