Regex extract variables from [shortcode]

后端 未结 4 1712
礼貌的吻别
礼貌的吻别 2020-12-18 08:50

After migrating some content from WordPress to Drupal, I\'ve got som shortcodes that I need to convert:

String content:

Irre

4条回答
  •  囚心锁ツ
    2020-12-18 09:45

    This is my interpretation, I come from a WordPress background and tried to recreate the setup for a custom php project.

    It'll handle things like [PHONE] [PHONE abc="123"] etc

    The only thing it falls flat on is the WordPress style [HERE] to [HERE]

    Function to build a list of available shortcodes

    
    // Setup the default global variable
    
    function create_shortcode($tag, $function)
    {
        global $shortcodes;
        $shortcodes[$tag] = $function;
    }
    
    

    define shortcodes individually, e.g. [IFRAME url="https://www.bbc.co.uk"]:

    
    /**
     * iframe, allows the user to add an iframe to a page with responsive div wrapper
     */
    create_shortcode('IFRAME', function($atts) {
    
        // ... some validation goes here
    
        // The parameters that can be set in the shortcode
        if (empty($atts['url'])) {
            return false;
        }
    
        return '
        
    '; });

    Then when you want to pass a block of html via the shortcode handling do... handle_shortcodes($some_html_with_shortcodes);

    function handle_shortcodes($content)
    {
    
        global $shortcodes;
    
        // Loop through all shortcodes
        foreach($shortcodes as $key => $function){
    
            $matches = [];
    
            // Look for shortcodes, returns an array of ALL matches
            preg_match_all("/\[$key([^_^\]].+?)?\]/", $content, $matches, PREG_UNMATCHED_AS_NULL);
    
            if (!empty($matches))
            {
                $i = 0;
                $full_shortcode = $matches[0];
                $attributes = $matches[1];
    
                if (!empty($attributes))
                {
                    foreach($attributes as $attribute_string) {
    
                        // Decode the values (e.g. " to ") 
                        $attribute_string = htmlspecialchars_decode($attribute_string);
    
                        // Find all the query args, looking for `arg="anything"`
                        preg_match_all('/\w+\=\"(.[^"]+)\"/', $attribute_string, $query_args);
    
                        $params = [];
                        foreach ($query_args[0] as $d) {
    
                            // Split the
                            list($att, $val) = explode('=', $d, 2);
    
                            $params[$att] = trim($val, '"');
                        }
    
                        $content = str_replace($full_shortcode[$i], $function($params), $content);
                        $i++;
                    }
                }
            }
        }
        return $content;
    }
    

    I've plucked these examples from working code so hopefully it's readable and doesn't have any extra functions exclusive to our setup.

提交回复
热议问题