表达式
首先,让我们计算出匹配单词数组所需的表达式:
/(?:word1|word2|word3)/
(?: ... ) 表达式创建一个组,但不将其内容捕获到内存位置。单词由管道符号分隔,以便匹配任一单词。
要使用 PHP 生成此表达式,您需要以下构造:
$unwanted_words = array("word1", "word2", "word3");
$unwanted_words_match = '(?:' . join('|', array_map(function($word) {
return preg_quote($word, '/');
}, $unwanted_words)) . ')';
您需要preg_quote() 从常规字符串生成有效的正则表达式,除非您确定它是有效的,例如"abc" 不需要引用。
另见:array_map()preg_quote()
使用线数组
您可以将文本块拆分为行数组:
$lines = preg_split('/\r?\n/', $block_of_lines);
然后,您可以使用preg_grep() 过滤掉不匹配的行并生成另一个数组:
$wanted_lines = preg_grep("/$unwanted_words_match/", $lines, PREG_GREP_INVERT);
另见:preg_split()preg_grep()
使用单个preg_replace()
要匹配包含多行文本块中不需要的单词的整行,您需要使用行锚,如下所示:
/^.*(?:word1|word2|word3).*$/m
使用 /m 修饰符,锚点 ^ 和 $ 分别匹配行的开头和结尾。两边的.*“刷新”匹配词左右的表达式。
需要注意的一点是$ 匹配就在实际行结束字符(\r\n 或\n)之前。如果您使用上面的表达式执行替换,它将不会替换行尾本身。
您需要通过像这样扩展表达式来匹配这些额外的字符:
/^.*(?:word1|word2|word3).*$(?:\r\n|\n)?/m
我在$ 锚点后面添加了(?:\r\n|\n)? 以匹配可选的行尾。这是执行替换的最终代码:
$replace_match = '/^.*' . $unwanted_words_match . '.*$(?:\r\n|\n)?/m';
$result = preg_replace($replace_match, '', $block_of_lines);
Demo