伙计们( preg_replace 大师);
我正在寻找一个 preg_replace 片段,我可以在 php 文件中使用它,如果某个单词出现在特定行中,则整行将被删除/替换为空行
伪代码:
$unwanted_lines=array("word1","word2"."word3");
$new_block_of_lines=preg_replace($unwanted_lines, block_of_lines);
谢谢。
伙计们( preg_replace 大师);
我正在寻找一个 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()
使用线数组
您可以将文本块拆分为行数组:
$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);
正如@jack 指出的那样,让我们使用preg_quote()
&&array_map()
$array = array('word1', 'word2', 'word3', 'word#4', 'word|4');
$text = 'This is some random data1
This is some word1 random data2
This is some word2 random data3
This is some random data4
This is some word#4 random data5
This is some word|4 random data6
This is some word3 random data7'; // Some data
$array = array_map(function($v){
return preg_quote($v, '#');
}, $array); // Escape it
$regex = '#^.*('. implode('|', $array) .').*$#m'; // construct our regex
$output = preg_replace($regex, '', $text); // remove lines
echo $output; // output
此正则表达式可以从一行中删除匹配项
$newstring = preg_replace("/^.*word1.*$/", "", $string);