Php 仅在href中不包含的URL的位置插入嵌入代码

Php 仅在href中不包含的URL的位置插入嵌入代码,php,regex,drupal,str-replace,Php,Regex,Drupal,Str Replace,我正在Drupal8网站上定制一个模块,其中某些vimeo或youtube URL被转换成嵌入式iframe视频。模块本身工作得很好,但是当有标签时会出现问题 post的主体可能看起来像这样: https://vimeo.com/id1 //this line should get replaced with embed code by module <a href="https://vimeo.com/id1"> Check out this video &

我正在Drupal8网站上定制一个模块,其中某些vimeo或youtube URL被转换成嵌入式iframe视频。模块本身工作得很好,但是当有标签时会出现问题

post的主体可能看起来像这样:

    https://vimeo.com/id1   //this line should get replaced with embed code by module

    <a href="https://vimeo.com/id1"> Check out this video </a> //here, anything that is in href="" should not be replaced
on <a href="https://vimeo.com"> Vimeo </a>
到目前为止,我试图做的是:

  • 在href标记中放置一个占位符文本代替url,然后用嵌入代码替换所有url,然后将url放回占位符中
  • 从文本中删除引号之间的所有URL(修复了一半问题)

本质上,我要寻找的是一种用嵌入代码替换$URL的干净方法,同时忽略html标记中以引号或任何其他方式打印的$URL

正确答案需要使用解析器。
对于一个更粗糙的解决方案,您可以在正则表达式中使用
(*SKIP)(*FAIL)
,例如

<a[^>]*>[^<]*</a>(*SKIP)(*FAIL)|https?:\S+

这似乎有效。然而,在某些情况下,如果帖子主体有多个视频url,则每个url都会被相同的嵌入代码替换。在这个正则表达式代码中,我是否应该以某种方式将https?:part替换为$url?我将https?:\S+part更改为url,它就可以工作了。我想这不是最干净的解决办法,但是well@MantasBagdonas:这对嵌套链接(此处使用解析器)或锚文本/属性中的任何位置都不起作用。对不起,您能告诉我一些有关解析器的信息来源吗?因为我不太确定你的建议,我也不知道该找什么
<a[^>]*>[^<]*</a>(*SKIP)(*FAIL)|https?:\S+