0

我正在尝试获取单个 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/”。

4

2 回答 2

1

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

/<p>\s*(https?:\/\/(?:(?!<\/?p>).)+)\s*<\/p>/

逻辑是我们寻找一个<p>以 开头的标签,http然后将其他所有内容都放在那里,直到我们找到一个</p>。第一个反向引用将保存 URL。

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

于 2012-08-24T20:09:15.203 回答
1

我可能误解了您的问题,但这里有一个 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
这应该是相当有弹性的 - 考虑到 HTML 标签上的 cosideration 选项子域、https 和属性。

于 2012-08-24T20:14:08.557 回答