Удалить дубликаты определенных символов из строки

Как удалить дубликаты символов, найденных в массиве $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;