php preg_replace 删除整行(从多行的 block 中),如果它包含一个词的出现

标签 php regex preg-replace

伙计们(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);

Demo

关于php preg_replace 删除整行(从多行的 block 中),如果它包含一个词的出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17466320/

相关文章:

javascript - 将 php 变量传递到 html 输入标记的值中是一种不好的做法吗?

r - 在 R 中的特定模式之后的任何位置查找第一个数字

php - regex- preg_replace - 换行后的空格!

php - 在php中用单引号替换json字符串中的双引号

php - 用于删除两个相似字符和其他尾随字符的表达式

php - 如何防止用户以任何可能的方式获得一些显示的文本?

php - 在 php 中执行程序 - 显示并返回输出

java - 在未知索引处的某些字符之间搜索子字符串

php - 用于删除 iframe 的正则表达式

php - 一对多关系 - 仅显示第一行