我的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');
答案 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动词跳过匹配并继续在上一个省略的匹配结束时搜索新的匹配。