如果找到彼此相邻的字符$a
,我怎么能删除数组$b
中找到的重复字符?
$a = array("a","b","c");
$b = "aabcccdef";
输出应为
abcdef
可以使用正则表达式找到字符,但我不知道如何检测字符是否彼此相邻。
答案 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);
说明:
生成的表达式看起来像(a|b)\1+
,其中a|b
与a
或b
匹配。 \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;