8

伙计们( preg_replace 大师);

我正在寻找一个 preg_replace 片段,我可以在 php 文件中使用它,如果某个单词出现在特定行中,则整行将被删除/替换为空行

伪代码:

$unwanted_lines=array("word1","word2"."word3");
$new_block_of_lines=preg_replace($unwanted_lines, block_of_lines);

谢谢。

4

3 回答 3

8

表达方式

首先,让我们计算出匹配单词数组所需的表达式:

/(?: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);

演示

于 2013-07-04T09:21:48.293 回答
1

正如@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

在线演示

于 2013-07-04T09:19:36.893 回答
1

此正则表达式可以从一行中删除匹配项

$newstring = preg_replace("/^.*word1.*$/", "", $string);
于 2013-07-04T09:13:14.833 回答