我需要一份内容中每个短代码的列表。有没有办法把它们列出来?
这就是我需要的:
$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.
}
最合适的回答,由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);