【问题标题】:Regexp to remove text before any p tags正则表达式删除任何 p 标签之前的文本
【发布时间】:2019-01-10 00:31:56
【问题描述】:

我在 PHP 中的字符串中有一个 HTML 片段。它是一些 css 文本,后跟一个或多个 p-tag 封闭段落。

 .cs2E86D3A6{text-align:center; blarblarblar}<p>First paragraph. Keep this text</p><p>Second paragraph. Keep this text</p><p>Last paragraph.</p>

(恰好是 strip_tags 的结果。) 我想删除&lt;p&gt;First paragraph之前的垃圾文字,剩下的就是p标签里的那些了。

我试过了

preg_replace('@^.*(?=<p>)@','', $mystring)

但它只给了我最后一个&lt;p&gt;Last paragraph&lt;/p&gt;

会告诉教我一个完成任务的正则表达式。

【问题讨论】:

  • stackoverflow.com/a/1732454/477127 TL:DR,使用适当的 DOM 感知解析器
  • 完全尊重该建议。我的用例是处理从 Word 机械转换的 HTML(您可能会认为这是一个愚蠢的动机),我只是在清理输出。

标签: php regex html-parsing strip-tags


【解决方案1】:

你需要懒惰重复任何字符,直到你到达第一个&lt;p&gt;。您的.*贪婪,这意味着它会匹配尽可能多的字符,包括&lt;p&gt;s,只要后面有&lt;p&gt;。因此,它当前会匹配到字符串中的最后一个 &lt;p&gt;。将? 放在*+ 之后,使重复变得懒惰而不是贪婪:

$orig = '.cs2E86D3A6{text-align:center; blarblarblar}<p>First paragraph. Keep this text</p><p>Second paragraph. Keep this text</p><p>Last paragraph.</p>';
print(preg_replace('@^.*?(?=<p>)@','', $orig))

【讨论】:

    【解决方案2】:

    尝试使用函数strstr

    strstr($mystring, '<p>');
    

    它返回从'&lt;p&gt;' 开头到字符串结尾的所有内容。

    strstr 文档

    【讨论】:

    • 谢谢。它按照您的建议工作,是一个简单而优雅的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 2016-08-15
    • 2012-08-26
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多