正则表达式:Wordpress短代码到标准iFrame

时间:2014-04-30 06:55:36

标签: html regex wordpress

由于在通过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模式吗?

1 个答案:

答案 0 :(得分:0)

未经测试,但请参阅方法。已复制do_shortcode_tagdo_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];
        }
    }