【问题标题】:Insert embed code only in place of urls that are not in href仅插入嵌入代码来代替不在 href 中的 url
【发布时间】:2020-02-20 02:32:04
【问题描述】:

我正在定制一个 drupal 8 网站上的模块,其中某些 vimeo 或 youtube url 被转换为嵌入的 iframe 视频。模块本身很好用,但是当有标签时会出现问题

<a href="https://vimeo.com/videoid">Some text</a>.

帖子的正文可能看起来像这样:

    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>

在整个帖子正文中,模块匹配一个 url (https://vimeo.com/id1),然后使用 str_replace() 将每个 url 替换为生成的嵌入代码。

$embed_code = $this->convertVimeoUrlToEmbedCode($url);
$return['text'] = str_replace($url, $embed_code, $return['text']);

到目前为止,我尝试做的是:

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

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

【问题讨论】:

    标签: php regex drupal str-replace


    【解决方案1】:

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

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

    a demo on regex101.com

    【讨论】:

    • 这似乎有效。但是,在某些情况下,如果帖子正文有多个这样的视频网址,则每个网址都会被相同的嵌入式代码替换。在这个正则表达式代码中,我应该以某种方式用 $url 替换 https?: 部分吗?
    • 我将 https?:\S+ 部分更改为 url,它可以工作。我想这不是最干净的解决方案,但是哦,好吧
    • @MantasBagdonas:这不适用于嵌套链接(在此处使用解析器)或 &lt;/&gt; 锚文本/属性中的任何位置。
    • 对不起,你能指出一些关于解析器的资料吗?因为我不太确定你的建议是什么,我真的不知道要寻找什么
    猜你喜欢
    • 2012-01-22
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 2012-01-02
    • 1970-01-01
    相关资源
    最近更新 更多