如何清除字符串中重复的连续非字母字符?
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>
<?php
ini_set('display_errors', 1);
$string="ab::::c ---------d,,,e ..........f ::a-b,,,c..d";
echo preg_replace('/([,.:-])+/', '', $string);
方案二: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 — 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
这可能适合也可能不适合您的项目。
仅匹配字符串:,.:-
如何从字符串中删除重复值?例如有:
"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>
<?php ini_set('display_errors', 1); $string="ab::::c ---------d,,,e ..........f ::a-b,,,c..d"; echo preg_replace('/([,.:-])+/', '', $string);
方案二:
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 — 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
这可能适合也可能不适合您的项目。