2017-05-29 121 views

回答

2

这里我们使用preg_replace以实现期望的输出。

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

或者

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

这将匹配一个字符,并添加在拍摄组

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)); 
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/

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() & implode()

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

使用任一方法输出:

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

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


这里是一个迟到的考虑......如果你的字符串只有移动到一个有效的字符之前重复自己的符号的问题,那么您可以使用此模式:[-.,:]\K[-.,:]+它会比其他快50%执行模式,并提供与本页面上其他方法相同的输出,但确实会扩展您问题的解释。以下是一些暴露差异的例子:

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

这可能会或可能不适合你的项目。

相关问题