如何清除字符串中连续的非字母字符?
仅匹配字符串:,.:-
如何从字符串中删除重复值?例如具有:如何清除字符串中连续的非字母字符?
"ab::::c ---------d,,,e ..........f ::a-b,,,c..d"
预期输出:
"ab:c -d,e .f :a-b,c.d"
这里我们使用preg_replace
以实现期望的输出。
正则表达式:([,.:-])\1+
Regex demo
或者
正则表达式:(,|\.|:|-)\1+
Regex demo
这将匹配一个字符,并添加在拍摄组
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));
可以使用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/
对于未来读者,为了最大限度地提高效率,不要在你的模式中使用管道字符。使用循环的方法也会产生太多迭代的函数调用和/或条件。
输入:$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
这可能会或可能不适合你的项目。