仅为:,.:-
匹配字符串如何从字符串中删除重复值?例如:
"ab::::c ---------d,,,e ..........f ::a-b,,,c..d"
预期输出:
"ab:c -d,e .f :a-b,c.d"
答案 0 :(得分:2)
这里我们使用preg_replace
来实现所需的输出。
正则表达式: ([,.:-])\1+
Regex demo
或
正则表达式: (,|\.|:|-)\1+
Regex demo
1。这将匹配一个字符并在捕获的组中添加
2。使用该捕获的群组
\1
多次出现。
替换 $1
<?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
$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/