如何删除字符串中出现不止一次的单词?

时间:2015-10-08 16:11:06

标签: php arrays string split

我有一个这样的字符串:

$text = 'IvanFedorGalinaRomaIvanGalina';

如何删除该字符串中出现多于ocne但没有分隔符的所有单词?

我试过了:

$array = explode ("", $ text);
$result = array_unique ($array); 
$text = implode ("", $ result);
echo $text;
echo "<br>";

结果输出:

Ivan
Fedor
Galina
Roma
Ivan
Galina

2 个答案:

答案 0 :(得分:4)

这应该适合你:

使用preg_split()将字符串拆分为大写字母。所以你最终会得到一个像这样的数组:

Array
(
    [0] => Ivan
    [1] => Feduor
    [2] => Galina
    [3] => Roma
    [4] => Ivan
    [5] => Galina
)

之后使用array_count_values()计算数组中每个单词存在的次数:

Array
(
    [Ivan] => 2
    [Feduor] => 1
    [Galina] => 2
    [Roma] => 1
)

然后使用array_filter()过滤此数组,并且只保留出现一次的单词。

最后使用array_keys()将单词作为数组中的值,然后您可以implode()为字符串。

代码:

<?php

    $text = 'IvanFeduorGalinaRomaIvanGalina';

    $arr = preg_split("/(?=[\p{Lu}])/u", $text, -1, PREG_SPLIT_NO_EMPTY);
    $unique = array_keys(array_filter(array_count_values($arr), function($v){
        return $v == 1;
    }));

    echo implode("", $unique);

?>

输出:

FeduorRoma

答案 1 :(得分:1)

如果大写分割对你不起作用,另一种方法可能是简单地通过正则表达式递归,直到你没有重复。当然,您需要指定最少的字符数。

<?php

$text = 'IvanFedorGalinaRomaIvanGalina';

$pattern = '/((.{4,}).*)\\2/';
$replacement = '\\1';

$text=preg_replace($pattern, $replacement, $text, 1, $count);
while ($count > 0) {
  $text=preg_replace($pattern, $replacement, $text, 1, $count);
}

print $text . "\n";

这将继续尝试替换4个以上字符的“单词”,直到没有更多替换为止。