伙计们(preg_replace gurus);
我正在寻找一个 preg_replace 片段,我可以在 php 文件中使用它,如果一个词出现在特定行中,则整行被删除/替换为空行
伪代码:
$unwanted_lines=array("word1","word2"."word3");
$new_block_of_lines=preg_replace($unwanted_lines, block_of_lines);
谢谢。
最佳答案
表达式
首先,让我们计算出匹配单词数组所需的表达式:
/(?: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()
使用一组线
您可以将文本 block 拆分为行数组:
$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()
要匹配包含多行文本 block 中不需要的单词的整行,您需要使用行 anchor ,如下所示:
/^.*(?:word1|word2|word3).*$/m
使用 /m
修饰符, anchor ^
和 $
分别匹配行的开始和结束。两侧的 .*
将匹配词左右的表达式“冲洗”。
需要注意的一件事是 $
匹配 就在 实际行结束字符(\r\n
或 \n
).如果您使用上述表达式执行替换,它不会替换行尾本身。
您需要像这样扩展表达式来匹配那些额外的字符:
/^.*(?:word1|word2|word3).*$(?:\r\n|\n)?/m
我在 $
anchor 后面添加了 (?:\r\n|\n)?
以匹配可选的行结尾。这是执行替换的最终代码:
$replace_match = '/^.*' . $unwanted_words_match . '.*$(?:\r\n|\n)?/m';
$result = preg_replace($replace_match, '', $block_of_lines);
关于php preg_replace 删除整行(从多行的 block 中),如果它包含一个词的出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17466320/