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

How clear duplicate consecutive non-alphabetic characters in a string?

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

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

预期输出:

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

此处我们使用 preg_replace 来实现所需的输出。

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

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

1. This will match a character and add that in captured group

2. using that captured group for </code> more than one occurence.</p> </blockquote> <p><strong>替换:</strong> <code>

Try this code snippet here

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

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

方案二: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));

您可以使用 preg_replace:

preg_replace — Perform a regular expression search and replace

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

您可以在这里尝试您的正则表达式:https://regex101.com/

对于未来的读者,为了获得最大效率,请不要在您的模式中使用管道字符。使用循环的方法也进行了过多的迭代函数调用 and/or 条件。

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

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

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

方法 #2:单行使用 preg_split() & implode()

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

使用任一方法的输出:

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

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


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

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

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