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

时间:2018-01-22 15:07:16

标签: php preg-replace

我用Google搜索并搜索了其他几十个答案,但无法找到任何可以解决以一个字符串开头的两行删除的内容,并以另一个字符串结尾,所以不包含&#34我曾尝试过什么"因为十几种模式甚至不会接近。

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

[Link] 2017_07_11_RM_4b.pdf

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

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

感谢您的任何帮助,谢谢。

4 个答案:

答案 0 :(得分:0)

此表达式(regex101.com处的示例)使用更改^的{​​{3}}来匹配每行的开头而不是字符串的开头。

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

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

附加说明

答案 1 :(得分:0)

这可能有效:

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

在这里,您需要查找多行文字,其中以[Link]开头(在这种情况下[]是字面的,这就是为什么反斜杠)后跟一个空格{ {1}},在您的情况下是一个新行,然后是任意数量的字母,数字和下划线,在字符串末尾有一个\s

重要的是要注意这将为您想要的文本创建一个catch组,因此在您的.pdf中,您现在应该执行以下操作:

preg_replace

答案 2 :(得分:0)

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

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

<强>解释

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

  • *? - 这是一个懒惰的量词,会在比赛的第一次出现时停止。

  • 最后,我在最后添加了\s以删除剩余的换行符,但您也可以将其删除。

<强>更新

这也可以起作用:\[Link\]\s\w+\.pdf\s,给你一点性能提升。 Click for demo

答案 3 :(得分:0)

$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