Php preg_replace_回调匹配HTML段落中的URL

Php preg_replace_回调匹配HTML段落中的URL,php,regex,preg-replace-callback,Php,Regex,Preg Replace Callback,我正在尝试获取单个HTML段落中的URL,并使用PHP的preg\u replace\u callback提取它们。现在,WordPress通过以下方式实现这一点: preg_replace_callback( '|^\s*(https?://[^\s"]+)\s*$|im', 'callback_function', $string ); 但这与它自己的一行上的URL相匹配——周围没有HTML。我需要做的是从以下内容匹配URL: <p>http://youtube.com/<

我正在尝试获取单个HTML段落中的URL,并使用PHP的
preg\u replace\u callback
提取它们。现在,WordPress通过以下方式实现这一点:

preg_replace_callback( '|^\s*(https?://[^\s"]+)\s*$|im', 'callback_function', $string );
但这与它自己的一行上的URL相匹配——周围没有HTML。我需要做的是从以下内容匹配URL:

<p>http://youtube.com/</p>
<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>
从这段文字中,我想摘录的是这段文字本身。我在另一段中看到Google.com的链接,但我不想这样。我想要的只是在他们自己的段落中的链接。它将传递给我的回调函数http://youtube.com/'作为参数。

您可以尝试以下方法:

/\s*(https?:\/\/(?:(?!))+)\s*/

逻辑是我们寻找一个
标记,该标记以
http
开头,然后将其他所有内容都放在那里,直到找到一个

。第一个反向引用将保存URL


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

我可能误解了您的问题,但这里有一个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
/]*>https?:\/\/([A-Za-z0-9-]\)?[A-Za-z0-9][A-Za-z0-9-]+?\.[A-Za-z0-9]+[A-Za-z0-9-\.\:\/\?\[\].$&'()\*+,;=]*/gi
请记住,regexp是非常复杂的,而且几乎肯定有一些边缘情况我在这里没有考虑。如果你能用一些在这里不起作用的例子更新你的问题,或者留下评论,我会更新答案

更新2

这里有一个应该是相当有弹性的——考虑到了联合定义选项子域、https和HTML标签上的属性。

Sean,你能发布一些需要考虑的边缘案例的示例简介吗?我想你贴的那张相当简单。请张贴例子。您希望拉取带有周围标记的URL还是不带标记的URL?我这样问是因为你的例子与文章中的URL完全匹配。示例将有助于明确您想要描述的内容。只是提出了一个更新,我需要匹配!哦,我想我误解了-没有意识到你只需要,以为你需要所有的标签:)超时,所以格式化我的转义很奇怪。不要复制那个正则表达式!更好-为mishapAh感到抱歉,我正在降低价格,希望用嵌入的内容替换单独的URL。无论如何谢谢你!HTML解析起来很糟糕,但至少我知道它会是什么样子。:)那个应该好一点。仍然让我紧张-测试很重-但应该很接近。这对我来说是完美的。我想单独使用这些URL,并使用oEmbed插入YouTube视频、Flickr等,我必须用嵌入代码替换URL——完美。