【问题标题】:PHP Preg_Replace data between tags, respecting other tags within the documentPHP Preg_Replace 标签之间的数据,尊重文档中的其他标签
【发布时间】:2011-07-18 03:25:47
【问题描述】:

对此可能有一个非常简单的答案,但我想尽可能详细,这样你就不需要我澄清了。

我正在尝试收集每个的内容

<content><div>CONTENT</div></content>

内容需要作为反向引用返回 ($1)。 content 和 div 都有不同的参数(例如style="color: white;")。这些参数并不重要,但仍然存在。

复杂之处在于 div 可能包含子 div。这些并不重要,但与我当前的正则表达式冲突 - 尽早停止匹配。

这是一个代码示例,想象一下这个复制/粘贴了几次并且格式不同。

<entry> 
<title>A general title of a post</title> 
<content type="xhtml"> 
    <div xmlns="http://www.w3.org/1999/xhtml"> 
    This is a description of the title. It may <b>contain bold text</b> or <div>even divs</div>, and everything else. It is not quite important to save these tags, but they exist nonetheless.
    </div> 
</content> 
</entry>

目前,我正在使用两个正则表达式代码。一个用于声明,一个用于结束标记。这可行,但现在我需要对内容执行代码。所以,我会用preg_replace_callback(),但是我不知道怎么把两者联系起来,这样中间就是回调了。

声明:

<content \w+\s*=\s*\".*?\">[\r\n\s]{0,}<div \w+\s*=\s*\".*?\">

结束:

</div>[\r\n\s]{0,}</content>

我需要将这些结合起来,并将内容作为回调返回。我尝试过类似([\w\W]{0,}) 的方法,它绝对会返回所有内容,但这场比赛不会在结束 div 处停止。

所以我发现了\bFULLWORD\b 命令,并把\bdiv\b 扔在上面......但我没有成功让它工作。也许它不受 PHP 支持?或者我很笨。

我不知道。

请帮忙!

【问题讨论】:

  • 不要使用正则表达式来操作 HTML:使用 DOM -- 参见 DOMDocument 类:fr2.php.net/domdocument
  • 请看link
  • 这次我必须同意^^ “他说耶和华!”。只有通过大量的努力和递归正则表达式才能匹配嵌套标签。使用更简单的方法,例如phpQuery or QueryPath 来提取内容。 qp($html)-&gt;find("content div")-&gt;text();

标签: php regex rss preg-replace preg-replace-callback


【解决方案1】:

以前说过,现在也说过,不幸的是,它又要被重复了。正则表达式是一个很棒的工具。它非常适合处理字符串正则表达式的模式匹配

HTML 不是字符串。 HTML 是一种标记语言,而不是常规语言。它实际上不是一个字符串,但可以解释为一个字符串(因此,我们可以在技术上使用正则表达式来操作 HTML)。 HTML 是基于元素节点的自己的语言,如果要更改某些内容,则需要操作这些元素。

正如 cmets 中所指出的,您可以在 PHP 中轻松使用 DOM class

您想要这样做有很多原因:

  • 更简单,您无需制作一些看起来像猫在键盘上走过的疯狂图案
  • (再次)更简单,您可以导航到特定节点,而不是处理整个文档。
  • 这样更安全,不会意外更改不想更改的内容
  • 它更安全(再次),源数据可以更改,您可以检测到它并加以说明。
  • 更安全(再次),您可以优雅地失败。

怎么做?

【讨论】:

  • 我认为在没有实际回答的情况下“回答”问题是不合适的。这可能是您对最佳实践的想法,但它并没有贡献 OP 的正则表达式工作知识(而且它有点精英主义)。
【解决方案2】:

使用 DOM 解析器。这是一个例子:http://htmlparsing.com/php.html

【讨论】:

  • 这是一个“道德”的回答,而不是对实际问题的回答。它对正则表达式的工作知识没有任何帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
相关资源
最近更新 更多