Как очистить повторяющиеся последовательные неалфавитные символы в строке?

Соответствует строке только для: ,.:- Как я могу удалить повторяющиеся значения из строки? Например, имея:

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

Ожидаемый результат:

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

1

Решение

Здесь мы используем 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));
2

Другие решения

Для будущих читателей, для максимальной эффективности не используйте переданные по конвейеру символы в вашем образце. Методы, которые используют циклы, также делают слишком много повторных вызовов функций и / или условий.

Входные данные: $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

Это может или не может быть подходящим для вашего проекта.

1

Вы можете сделать это используя 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/

0
По вопросам рекламы [email protected]