PHP preg_replace - 与锚链接不匹配

时间:2017-07-18 19:33:05

标签: php preg-replace

我的Wordpress主题中有一个自定义功能,用于查找YouTube网址并自动将其转换为嵌入式iframe。这很好用,但有一个小问题。目前,该功能还取代了链接到文本的YouTube链接。因此,如果我有一个指向YouTube的锚标记,它会将iframe代码抛入锚点并导致HTML问题。

因此,如果我有一个Wordpress帖子并且帖子中有以下内容,我希望将其转换为iframe:

https://www.youtube.com/watch?v=HDDLTwS4zgs

但如果我的文字链接到YouTube,我不希望它被转换:

<a href="https://www.youtube.com/watch?v=HDDLTwS4zgs">Check out Linus' latest video</a>

这是我的PHP函数:

function convertYoutube($string) {
    return preg_replace(
        "/\s*[a-zA-Z\/\/:\.]*youtu(be.com\/watch\?v=|.be\/)([a-zA-Z0-9\-_]+)([a-zA-Z0-9\/\*\-\_\?\&\;\%\=\.]*)/i",
        "<div class=\"embed-responsive embed-responsive-16by9 scroll-in\"><iframe width=\"560\" height=\"315\" src=\"//www.youtube.com/embed/$2\" frameborder=\"0\" allowfullscreen></iframe></div>",
        $string
    );
}

add_filter('the_content', 'convertYoutube');

1 个答案:

答案 0 :(得分:1)

可以通过添加<a\b[^>]*>[^<]*</a>(*SKIP)(*FAIL)|替代方法来修复模式:

'~<a\b[^>]*>[^<]*</a>(*SKIP)(*FAIL)|\s*[a-zA-Z/:.]*youtu(be\.com/watch\?v=|\.be/)([\w-]+)([\w/*?&;%=.-]*)~'

请参阅regex demo

另请注意,如果您使用不同的正则表达式分隔符,则/不需要转义。必须转义字符类.外部的[...]以匹配文字点。如果未使用\w修饰符,则[A-Za-z0-9_]等于u。字符类-内的[...]不必在类的开头/结尾(以及范围或速记字符类之后)进行转义。

更新模式详情

<a\b - 匹配整个字符串<a   - [^>]* - 除>以外的0 +字符   - > - >符号   - [^<]* - 除<以外的0 +字符   - </a> - 文字子字符串   - (*SKIP)(*FAIL) - PCRE动词跳过匹配并继续在上一个省略的匹配结束时搜索新的匹配。