如何清除字符串中重复的连续非字母字符?

时间:2017-05-29 15:51:30

标签: php regex duplicates preg-replace non-alphanumeric

仅为:,.:-匹配字符串如何从字符串中删除重复值?例如:

"ab::::c ---------d,,,e ..........f ::a-b,,,c..d"

预期输出:

"ab:c -d,e .f :a-b,c.d" 

3 个答案:

答案 0 :(得分:2)

这里我们使用preg_replace来实现所需的输出。

正则表达式: ([,.:-])\1+ Regex demo

正则表达式: (,|\.|:|-)\1+ Regex demo

  

1。这将匹配一个字符并在捕获的组中添加

     

2。使用该捕获的群组\1多次出现。

替换 $1

Try this code snippet here

<?php
ini_set('display_errors', 1);

$string="ab::::c ---------d,,,e ..........f ::a-b,,,c..d";
echo preg_replace('/([,.:-])\1+/', '$1', $string);

解决方案2: using foreach loop

Try this code snippet here

$string="aab::::css ---------ddd,,,esddsff ..........f ::a-b,,,c..d";
$chars=  str_split($string);
$result=array();
foreach($chars as $character)
{
    if($character!=end($result) ||  !in_array($character, array(":",",",".","-")))
    {
        $result[]=$character;
    }
}
print_r(implode("",$result));

答案 1 :(得分:1)

对于未来的读者,为了最大限度地提高效率,请不要在模式中使用管道字符。使用循环的方法也会进行过多的迭代函数调用和/或条件。

输入:$in="ab::::c ---------d,,,e ..........f ::a-b,,,c..d";

方法#1:使用preg_replace()进行单线程(注意空替换字符串)

echo preg_replace('/([,.:-])\K\1+/','',$in);
//                          ^^ resets the start of the matched substring

方法#2:使用preg_split()&amp; implode()

echo implode(preg_split('/([,.:-])\K\1+/',$in));  // empty glue doesn't need mentioning

使用任一方法输出:

ab:c -d,e .f :a-b,c.d

我想知道哪个方法在这个页面上效率最高。如果有人愿意用Sahil的2种方法和我的两种方法来运行和发布基准测试,那将是非常有启发性的。

这是一个迟到的考虑因素...如果你的字符串在转移到有效字符之前只有重复符号的问题,那么你可以使用这种模式:[-.,:]\K[-.,:]+它将比其他所有字符快50%此页面上的模式,它提供与此页面上的其他方法相同的输出,但确实扩展了您的问题的解释。以下是一些揭示差异的例子:

ab:-,.c;将减少到ab:c
ab:-,.c -d.,.e--f将缩减为ab:c -d.e-f

这可能适合您的项目,也可能不适合。

答案 2 :(得分:0)

您可以使用preg_replace执行此操作:

  

preg_replace - 执行正则表达式搜索并替换

$pattern = '/(\.|\,|\:|\-){2,}/';
$string = 'ab::::c ---------d,,,e ..........f ::a-b,,,c..d';
echo preg_replace($pattern, '$1', $string);

您可以在此处试用正则表达式:https://regex101.com/