我可以想象有很多技术可以提供您想要的输出,但是您需要的逻辑在您的问题中定义不明确。我假设整个单词匹配是必需的——所以在任何正则表达式模式中都应该使用单词边界。没有提到区分大小写。我不确定是否只有完全唯一的元素(多词字符串)应该将它们的词输入黑名单。我将提供一些片段,但选择适当的技术将取决于确切的逻辑要求。
演示
$output = [];
$blacklist = [];
foreach ($input as $string) {
if (!$blacklist || !preg_match('/\b(?:' . implode('|', $blacklist) . ')\b/', $string)) {
$output[] = $string;
}
foreach(explode(' ', $string) as $word) {
$blacklist[$word] = preg_quote($word);
}
}
var_export($output);
演示
$output = [];
$blacklist = [];
foreach ($input as $string) {
$words = explode(' ', $string);
foreach ($words as $word) {
if (in_array($word, $blacklist)) {
continue 2;
}
}
array_push($blacklist, ...$words);
$output[] = $string;
}
var_export($output);
我最喜欢它,因为它在父循环中执行最少的迭代,更紧凑,并且不需要黑名单数组的声明/维护。
演示
$output = [];
while ($input) {
$output[] = $words = array_shift($input);
$input = preg_grep('~\b(?:\Q' . str_replace(' ', '\E|\Q', $words) . '\E)\b~', $input, PREG_GREP_INVERT);
}
var_export($output);