【问题标题】:preg_replace_callback Matching URLs in HTML Paragraphspreg_replace_callback 匹配 HTML 段落中的 URL
【发布时间】:2012-08-20 09:37:52
【问题描述】:

我正在尝试获取单个 HTML 段落中的 URL,并使用 PHP 的 preg_replace_callback 提取它们。现在,WordPress 这样做:

preg_replace_callback( '|^\s*(https?://[^\s"]+)\s*$|im', 'callback_function', $string );

但这与它自己的行上的 URL 匹配——它周围没有 HTML。我需要做的是匹配这样的 URL:

<p>http://youtube.com/</p>

我不关心段落标记前后的空格,我要做的就是提取该 URL 以用preg_replace_callback 替换更详细的信息。

有什么帮助吗?


更新: 好的,我有一个帖子的文字,里面有很多这样的段落:

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis et nunc vel felis vulputate tincidunt. In dapibus tempus sollicitudin. Nullam quis ultricies tortor. Ut malesuada aliquet enim. Aliquam et lobortis urna. Sed commodo malesuada malesuada. Donec cursus nisi nec mauris venenatis pharetra. Curabitur ut leo purus.</p>

<p>http://youtube.com/</p>

<p>Etiam non odio tellus, vel imperdiet nunc. Praesent rutrum sagittis purus, quis pretium eros varius ut. http://google.com/ Ut id orci eu lacus aliquam luctus. Sed dolor quam, suscipit eu dapibus feugiat, lacinia vitae augue.</p>

从该文本中,我只想提取段落中的http://youtube.com/。我看到另一段中有一个 Google.com 链接,但我不希望这样。我想要的只是他们自己段落中的链接(或链接)。它会作为参数传递给我的回调“http://youtube.com/”。

【问题讨论】:

  • 肖恩,您能否发布一些需要考虑的边缘情况的示例简介?我想你发布的那个很简单。
  • 同意。请发布示例。您想提取带有或不带有周围标签的 URL 吗?我问是因为您的示例 确实 与发布的段落中的 URL 完全匹配。示例将有助于准确说明您要描述的内容。
  • 刚刚发布了我需要匹配的更新!
  • 哦,我猜我误会了 - 没有意识到你只需要

    ,以为你需要所有标签 :)

标签: php regex preg-replace-callback


【解决方案1】:

你可以试试这个:http://regex101.com/r/rN4vB3

/&lt;p&gt;\s*(https?:\/\/(?:(?!&lt;\/?p&gt;).)+)\s*&lt;\/p&gt;/

逻辑是我们查找以http 开头的&lt;p&gt; 标签,然后将其他所有内容都放入其中,直到找到&lt;/p&gt;。第一个反向引用将保存 URL。

这可能不是最佳解决方案,但应该按照您的要求进行。

【讨论】:

  • 这对我来说是完美的。我想单独使用这些 URL,并使用 oEmbed 来拉入 YouTube 视频、Flickr 等。我必须用嵌入代码替换 URL - 完美。
【解决方案2】:

我可能误解了您的问题,但这里有一个 REGEXP(理想情况下)将匹配文本块中的任何 URL。

/<[A-Za-z0-9]+[^>]*>https?:\/\/([A-Za-z0-9-]\.)?[A-Za-z0-9][A-Za-z0-9-]+?\.[A-Za-z0-9]+[A-Za-z0-9-\._~:\/\?#\[\]@!$&'()\*+,;=]*<\/[A-Za-z0-9]+>/gi

记住,正则表达式非常复杂,几乎可以肯定有一些我在这里没有考虑过的边缘情况。如果你可以用一些在这里不起作用的例子来更新你的问题,或者留下评论,我会更新答案。

更新 2
这应该是相当有弹性的——考虑到共同考虑选项子域、https 和 HTML 标记上的属性。

【讨论】:

  • 超时,所以我的转义格式很奇怪。不要复制那个正则表达式!
  • 更好 - 对这次事故感到抱歉
  • 啊,我正在使用 Markdown 内容并想用 oEmbeded 的东西替换单独的 URL。不管怎样,谢谢你! HTML 解析起来很糟糕,但至少我知道它会是什么样子。 :)
  • 那个应该会好一点。仍然让我紧张 - 进行大量测试 - 但它应该很接近。
猜你喜欢
  • 2013-03-17
  • 1970-01-01
  • 2019-03-25
  • 2012-07-10
  • 1970-01-01
  • 2018-10-13
  • 2016-05-16
  • 1970-01-01
  • 2021-03-30
相关资源
最近更新 更多