Php 从字符串中删除某些字符的重复项

Php 从字符串中删除某些字符的重复项,php,Php,如果数组$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 ($mat

如果数组
$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;
对于($i=0;$i)
另一种更为复杂的方式可能是:

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;
对于($i=0;$i另一种方式:

$expression = join('|', $a);
$b = preg_replace('/(' . $expression . ')\1+/', '$1', $b);

说明:

生成的表达式看起来像
(a | b)\1+/code>,其中
a | b
匹配
a
b
\1
匹配第一个捕获组所匹配的任何内容
(a | b)
。这就是如何匹配一组重复字符的方法。然后,匹配的字符将被捕获组的内容替换(
$1

这不仅适用于单个字符,而且适用于任何子字符串

如果字符串可以包含特殊的正则表达式字符,您应该首先(
array\u map('preg\u quote',$a)
应该可以正常工作)。

另一种方法:

$expression = join('|', $a);
$b = preg_replace('/(' . $expression . ')\1+/', '$1', $b);

说明:

生成的表达式看起来像
(a | b)\1+/code>,其中
a | b
匹配
a
b
\1
匹配第一个捕获组所匹配的任何内容
(a | b)
。这就是如何匹配一组重复字符的方法。然后,匹配的字符将被捕获组的内容替换(
$1

这不仅适用于单个字符,而且适用于任何子字符串


如果字符串可以包含特殊的正则表达式字符,那么首先(
array\u map('preg\u quote',$a)
应该可以正常工作).

太棒了,尽管我不得不承认我对第一个数组有点困惑。要创建第一个数组,你可以做一个foreach并向每个值添加/+//或者只使用第二个选项。太棒了,尽管我不得不承认我对第一个数组有点困惑。要创建第一个数组,你可以做一个foreach并向每个值添加/+/+//或者只使用第二种选择