Как удалить дубликаты символов, найденных в массиве $a
из строки $b
только если они найдены рядом друг с другом?
$a = array("a","b","c"); $b = "aabcccdef";
Результат должен быть
abcdef
Символы можно найти с помощью регулярного выражения, но я не знаю, как определить, находятся ли символы рядом друг с другом.
preg_replace( array('/a+/','/b+/','/c+/'),array('a','b','c',), $b );
Другой способ, который может быть более сложным, – это:
preg_replace_callback('/(\w+)/', function ($matches) use ($a) { if ( in_array($matches[1][0],$a) ) //> if you need UTF-8 working use mb_substr here return $matches[1][0]; },$b); //> both untested
Другой способ, старый способ (это может быть немного быстрее на нескольких строках символов):
$c = ''; $cache = false; for ($i=0;$i<strlen($b);$i++) { $char = $b[$i]; if ($char !== $cache || !in_array($char,$a)) $c .= $char; $cache=$char; } echo $c;
Другой путь:
$expression = join('|', $a); $b = preg_replace('/(' . $expression . ')\1+/', '$1', $b);
DEMO
Объяснение:
Сгенерированное выражение будет выглядеть как (a|b)\1+
, где a|b
соответствует либо a
либо b
. \1
соответствует тому, что было согласовано с первой группой захвата (a|b)
. Так вы можете сопоставить набор повторяющихся символов. Затем матч заменяется содержимым группы захвата ( $1
).
Это будет работать не только с одиночными символами, но и с любыми подстроками.
Если строки могут содержать специальные символы регулярного выражения, вы должны сначала избежать этих символов ( array_map('preg_quote', $a)
должен работать нормально).
<?php $a = array('a', 'b', 'c'); $b = 'aabcccdef'; $c = ''; for($i = 0; $i < strlen($b); $i++) { if(in_array($b[$i], $a) && (substr($c, -1) === $b[$i])) { continue; } $c .= $b[$i]; } echo $c;