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

时间:2012-02-19 16:19:03

标签: php

如果找到彼此相邻的字符$a,我怎么能删除数组$b中找到的重复字符?

$a = array("a","b","c");
$b = "aabcccdef";

输出应为

abcdef

可以使用正则表达式找到字符,但我不知道如何检测字符是否彼此相邻。

3 个答案:

答案 0 :(得分:3)

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;

答案 1 :(得分:1)

另一种方式:

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

DEMO

说明:

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

这不仅适用于单个字符,还适用于任何子字符串。

如果字符串可以包含特殊的正则表达式字符,那么您应该escape those characters首先(array_map('preg_quote', $a)应该可以正常工作)。

答案 2 :(得分:0)

<?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;