preg_replace_callback匹配HTML段落中的URL

时间:2012-08-24 20:02:31

标签: php regex preg-replace-callback

我正在尝试使用单个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>

我不关心段落标记之前或之后的空格,我想要做的就是提取该网址,将其替换为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/'作为参数。

2 个答案:

答案 0 :(得分:1)

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

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

逻辑是我们要查找以<p>开头的http标记,然后在我们点击</p>之前获取其他所有内容。第一个反向引用将保留URL。

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

答案 1 :(得分: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和属性。