从内容中获取快捷代码列表

时间:2019-06-18 作者:Cray

我需要一份内容中每个短代码的列表。有没有办法把它们列出来?

这就是我需要的:

$str = \'[term value="Value" id="600"][term value="Term" id="609"]\';
所以每个短代码都应该在$str.

我找到了一个代码片段来检查是否有短代码。但我怎样才能全部显示出来呢?

$content = \'This is some text, (perhaps pulled via $post->post_content). It has a [gallery] shortcode.\';

if( has_shortcode( $content, \'gallery\' ) ) {
    // The content has a [gallery] short code, so this check returned true.

}

3 个回复
最合适的回答,由SO网友:birgire 整理而成

有一种方法:

你可以看看has_shortcode() 并在此处找到解析:

preg_match_all( 
    \'/\' . get_shortcode_regex() . \'/\', 
    $content, 
    $matches, 
    PREG_SET_ORDER
);
使用get_shortcode_regex() 正则表达式模式的函数。

对于非空匹配,您可以循环使用它们并收集完整的短码匹配:

$shortcodes = [];
foreach( $matches as $shortcode ) {
    $shortcodes[] = $shortcode[0];
}
最后,根据需要格式化输出,例如:

echo join( \'\', $shortcodes );
附:可以方便地将其包装到自定义函数中。

SO网友:HU ist Sebastian

如果只需要不带属性的短代码,可以使用此函数:

function get_used_shortcodes( $content) {
    global $shortcode_tags;
    if ( false === strpos( $content, \'[\' ) ) {
        return array();
    }
    if ( empty( $shortcode_tags ) || ! is_array( $shortcode_tags ) ) {
        return array();
    }
    // Find all registered tag names in $content.
    preg_match_all( \'@\\[([^<>&/\\[\\]\\x00-\\x20=]++)@\', $content, $matches );
    $tagnames = array_intersect( array_keys( $shortcode_tags ), $matches[1] );
    return $tagnames;
}
您将获得一个包含所有短代码的数组,这些短代码在您提供的内容中使用。

SO网友:Ian

Love@birgire的公认答案,但它的一个限制是,任何嵌套的短代码都会被遗漏。您可以通过创建一个简单的助行器来克服此问题:

function all_shortcodes($content) {
    $return = array();

    preg_match_all(
        \'/\' . get_shortcode_regex() . \'/\',
        $content,
        $shortcodes,
        PREG_SET_ORDER
    );

    if (!empty($shortcodes)) {
        foreach ($shortcodes as $shortcode) {
            $return[] = $shortcode;
            $return = array_merge($return, all_shortcodes($shortcode[5]));
        }
    }
    return $return;
}

$shortcodes_including_nested = all_shortcodes($post_content);