Соответствует строке только для: ,.:-
Как я могу удалить повторяющиеся значения из строки? Например, имея:
"ab::::c ---------d,,,e ..........f ::a-b,,,c..d"
Ожидаемый результат:
"ab:c -d,e .f :a-b,c.d"
Здесь мы используем preg_replace
достичь желаемого результата.
Regex: ([,.:-])\1+
Regex demo
Или же
Regex: (,|\.|:|-)\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));
Для будущих читателей, для максимальной эффективности не используйте переданные по конвейеру символы в вашем образце. Методы, которые используют циклы, также делают слишком много повторных вызовов функций и / или условий.
Входные данные: $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
Это может или не может быть подходящим для вашего проекта.
Вы можете сделать это используя 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/