删除PHP字符串中最后一个不连续、重复的单词/相位



好吧,我已经想了一段时间了,但似乎做不好。我需要从字符串的END中删除最后一个出现的不连续、重复的单词/短语。例如,我想要

Love in My Antonia Love in

Love in My Antonia Love

成为

Love in My Antonia

我尝试了无数种模式,但都没有成功。我最接近成功的是:

preg_replace('/b(w{2,})b(?=.*?\1)W*/', ''

删除第一次出现(而不是最后一次(,呈现:

in My Antonia Love (ORIGINAL: "Love in My Antonia Love")

My Antonia Love in (ORIGINAL: "Love in My Antonia Love in")

请帮忙!:(



更新(11月9日,太平洋标准时间下午2:00(:我应该澄清——如果可能的话——我希望解决方案保持我在示例中展示的简单、单行、紧凑的格式:

preg_replace('/b(w{2,})b(?=.*?\1)W*/', ''

我的例子已经几乎完美地工作了,只是它删除了第一个匹配,而不是

最后一个

以前,我提出了一个版本,可以在字符串中的任何位置找到两个连续的、重复的单词/短语,并将其替换为一个:

preg_replace('~b([S w]{3,})Kb(?:s*1)+~', '', 

这使得"披萨披萨"变成了"披萨","我走到商店,我走到了商店"变成"我走了商店"。这太棒了,我已经融入了这个解决方案。其次,我还需要"披萨是最好的披萨"变成"披萨是最棒的"。同样,"牧羊犬是很棒的宠物,狗是"应该变成"牧羊犬很棒的宠物"。所以,基本上,第一次出现在字符串中的哪一个并不重要;重要的是,字符串末尾出现的内容会被删除。我希望这能带来更多的清晰。

开始:

$s = preg_replace('/^b([w ]+)(.*?)b(1)$/i', '\1\2', $s);

测试:

$s = "Love in My Antonia Love in";
$s1 = "Love in My Antonia Love";
$s2 = "Love in My Antonia Love Not On End";
echo "Original:n$sn";
echo preg_replace('/^b([w ]+)(.*?)b(1)$/i', '\1\2', $s);
echo "n";
echo "Original:n$s1n";
echo preg_replace('/^b([w ]+)(.*?)b(1)$/i', '\1\2', $s1);
echo "n";
echo "Original:n$s2n";
echo preg_replace('/^b([w ]+)(.*?)b(1)$/i', '\1\2', $s2);

输出:

ZC-MGMT-04:~ jv$ php -q c.php
Original:
Love in My Antonia Love in
Love in My Antonia
Original:
Love in My Antonia Love
Love in My Antonia
Original:
Love in My Antonia Love Not On End
Love in My Antonia Love Not On End

===

更新:

Jason建议稍微更新单词末尾的地址:

preg_replace('/^b([w ]+)(.*?)bb(1)('s)*b$/i', '\1\2')

您可以在不使用正则表达式的情况下解决此问题,方法是将句子拆分为组成词,然后手动检查最后两个词:

$input = "Love in My Antonia Love in";
$words = preg_split("/s+/", $input);
$last = $words[count($words)-1];
$pattern = "/^(?=.*b" . $last . "b.*b" . $last . "b).*/";
if ($words[count($words) - 1] != $words[count($words) - 2] &&
preg_match($pattern, $input, $match)) {
array_pop($words);
}
$output = implode(" ", $words);
echo $input . "n" . $output;
Love in My Antonia Love in
Love in My Antonia Love

您需要先找到最长的重复子字符串,然后将其从主题字符串的末尾删除。这可以使用preg_match_all进行不区分大小写的搜索,然后使用preg_replace省略它们:

$str = 'Love in My Antonia Love in';
preg_match_all('~(bw++(?> w++)*)(?=.*?b1)~i', $str, $matches);
$array = array_unique(array_map('strtolower', $matches[1]));
foreach ($array as $value) {
$str = preg_replace("~^.*K(?<!s)s*b$value~i", '', $str);
}
echo trim($str); // Love in My Antonia

点击此处查看实时演示

最新更新