正则表达式删除以字符串开头、以另一个字符串结尾并包含新行的 2 行

Regex to remove 2 lines that begin with a string, ends with another string, and contains a new line

我在谷歌上搜索了又搜索,并查看了数十个其他答案,但找不到任何地址删除了以一个字符串开头并以另一个字符串结尾的两行,因此不包括 "what i've tried"因为十几个图案甚至都不够接近。

我们从 PDF 文件中提取了文本,结果中的所有链接在输出中显示为两行,如下所示:

[Link] 2017_07_11_RM_4b.pdf

他们总是[Link]开始,总是.pdf结束。它们在整个结果中出现,通常连续多次出现,然后是一段文本,以及更多链接,依此类推 - 出现次数多达 200 多次。我正在尝试获取文本块 而没有 这些两行字符串的出现 preg_replace() 大概看起来像这样:

$newtext = preg_replace("/^[Link]*$/", "", $text);

感谢任何帮助,谢谢。

此表达式(regex101.com) uses the multiline pattern modifier 处的示例更改 ^ 以匹配每行的开头而不是字符串的开头。

/(?:^\[Link\]\n[^\n]*+\n)++/m

$newtext = preg_replace("/(?:^\[Link\]\n[^\n]*+\n)++/m", "", $text);

补充说明

  • 我们正在使用 possessive 量词来防止不必要的回溯。

这可能有效:

/^\[Link\]\s*(\w+)\.pdf$/m

在这里您要查找以 [Link] 开头的多行文本(在本例中 [] 是文字,这就是反斜杠的原因)后跟一个空space \s,在你的例子中是换行,然后是任意数量的字母、数字和下划线,字符串末尾有一个 .pdf

请务必注意,这将为您想要的文本创建一个捕获组,因此在您的 preg_replace 中,您现在应该执行以下操作:

$newtext = preg_replace("/^\[Link\]\s*(\w+)\.pdf$/m", "", $text);

应该这样做:\[Link\][\s\S]*?\.pdf\s

演示https://regex101.com/r/NCqWES/2/

解释:

  • [\s\S] - 这意味着我们匹配每个空白或非空白字符,这反过来意味着我们匹配所有可能的字符,包括可能的换行符和将单词 \[Link\] 与单词 \.pdf 分隔开的空格。

  • *? - 这是一个惰性量词,它将在第一次出现匹配项时停止。

  • 最后,我在末尾添加了一个 \s 以删除剩余的换行符,但您也可以取消它。

更新:

这也可能有效:\[Link\]\s\w+\.pdf\s,给您一点性能提升。 Click for demo.

$str = <<<EOD
line1
[Link]
2017_07_11_RM_4b.pdf
line2
[Link]
2017_07_11_RM_4b.pdf
line3
EOD;
$newtext = preg_replace("/\[Link\]\R.+\.pdf\R/", "", $str);;
echo $newtext,"\n";

输出:

line1
line2
line3

解释:

  \[Link\]  : literally [link]
  \R        : any kind of linebreak
  .+        : 1 or more any character but newline
  \.        : a dot
  pdf       : literally pdf
  \R        : any kind of linebreak