由于在通过HTTPS提供SoundCloud Shortcode插件时存在一些小错误,我想运行Regex搜索&替换我的Wordpress博客。我总体上已经考虑过如何做到这一点,但我正在寻找为某些可能性做好准备的正则表达式模式。
当我从以下短代码手动抓取iframe嵌入代码时......
[soundcloud url="http://api.soundcloud.com/tracks/58082404" params="auto_play=false&show_artwork=false&color=372f2d" width="100%" height="166" iframe="true" /]
......它变成了这样的东西:
<iframe width="100%" height="400" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?visual=true&url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F58082404&show_artwork=true"></iframe>
您可能会注意到尺寸不同,并且某些参数不会传递。我将不得不以这种或那种方式处理这个问题,但是现在我正在寻找一种方法将短代码转换为带有所有原始参数的iframe。其中一个问题是,我无法确定短代码中是否有所有参数,并且这些参数的传递顺序可能不同。
[soundcloud url="…"]
[soundcloud url="…" width="…" height="…"]
[soundcloud width="…" height="…" url="…" params="…"]
[soundcloud height="…" width="…" params="…" url="…"]
我正在寻找一个正则表达式模式,以确保其中任何一个都转换为iframe播放器的嵌入代码。
<iframe width="WIDTH" height="HEIGHT" src="URL&PARAMS"></iframe>
任何人都可以提供正常工作的Regex模式吗?
答案 0 :(得分:0)
未经测试,但请参阅方法。已复制do_shortcode_tag
和do_shortcode
以附加到新的the_content
过滤条件上:
<?php
// Priority "10", do_shortcode has "11" and we would like parse that BEFORE the shortcodes will be handled...
add_filter('the_content', 'replaceHTTPS', 10);
function replaceHTTPS($content) {
global $shortcode_tags;
// Check if the content has shortcodes
if(strpos($content, '[') === false) {
return $content;
}
if(empty($shortcode_tags) || !is_array($shortcode_tags)) {
return $content;
}
// Get the Rexex to find shortcodes
$pattern = get_shortcode_regex();
// Replace the stuff
return preg_replace_callback("/$pattern/s", 'replaceHTTPS_Callback', $content);
}
function replaceHTTPS_Callback($matches) {
global $shortcode_tags;
// allow [[foo]] syntax for escaping a tag
if($matches[1] == '[' && $matches[6] == ']') {
return substr($matches[0], 1, -1);
}
$tag = $matches[2];
$attr = shortcode_parse_atts($matches[3]);
// LETS Start your own logical experiment!
// Check if the shortcode is "soundcloud"
if($tag == 'soundcloud') {
// check all entrys
if(isset($attr) && count($attr) > 0) {
foreach($attr AS $name => $value) {
// When Attribute "url"
if(strtolower($name) == 'url') {
// And when starts with "http://"
$test = 'http://';
if(substr($value, 0, strlen($test) == $test) {
// Than replace it,..
$attr[$name] = str_replace($test, 'https://', $value);
}
}
}
}
}
// enclosing tag - extra parameter
if(isset($matches[5])) {
return $matches[1] . call_user_func($shortcode_tags[$tag], $attr, $matches[5], $tag) . $matches[6];
// self-closing tag
} else {
return $matches[1] . call_user_func($shortcode_tags[$tag], $attr, null, $tag) . $matches[6];
}
}