看看 WP 如何使用简码,我认为我可以在项目中实现相同的结构,我认为这将在某些地方可用,但尚未追踪。
我开始从 preg_match_all 开始解析自己,
preg_match_all('/[[^]]*]/', $content, $match);
并按预期返回包含内容内所有短代码的数组,但随后查看使用值解析名称、变量或数组键,我开始对解析感到非常沉重。
我目前的想法是分解空格,然后解析每个空格,然后我在值中遇到空格,即使它们在引号中。因此,如果我先解析引用的数据,然后重新构建空间,这似乎非常浪费。我不需要在这里重新发明轮子,所以任何输入都很棒。
例子
[shortcodename key1="这是一个值" key2="34"]
想拥有
Array
(
[shortcodename] => Array
(
[key1] => this is a value
[key2] => 34
)
)
如果其他人想要做同样的事情,这里是完整的函数,显然这不是为了运行用户内容,但被调用的函数应该做任何检查,因为如果函数有返回值,这只会替换短代码。
function processShortCodes($content){ // locate data inside [ ] and
//process the output, place back into content and returns
preg_match_all('/\[[^\]]*\]/', $content, $match);
$regex = '~"[^"]*"(*SKIP)(*F)|\s+~';
foreach ($match[0] as $key => $val){
$valOrig = $val; // keep uncleaned value to replace later
$val = trim(substr($val, 1, -1));
$replaced = preg_replace($regex,":",$val);
$exploded = explode(':',$replaced);
if (is_array($exploded)){
$fcall = array();
$fcallName = array_shift($exploded); // function name
if (function_exists($fcallName)){ // If function exsist then go
foreach ($exploded as $aKey => $aVal){
$arr = explode("=", $aVal);
if (substr($arr[1], 0, 1) == '&'){
$fCall[$arr[0]]=substr($arr[1], 6, -6); // quotes can be "
}else{
$fCall[$arr[0]]=substr($arr[1], 1, -1);
}
}
if ( is_array($fCall) && $fcallName ){
$replace = call_user_func($fcallName, $fCall);
if ($replace){
$content = str_replace($valOrig,$replace,$content);
}
}
}
}
}