Глядя на то, как WP использует шорткоды, я подумал, что могу внедрить такую же структуру в проект, я предположил, что это будет полезно где-то, но пока не отследил.
Я начал анализировать себя, начиная с preg_match_all preg_match_all('/[[^]]*]/', $content, $match);
и это возвращает массив со всеми шорткодами внутри содержимого, как и ожидалось, но затем, глядя на синтаксический анализ имени, переменных или ключей массива со значениями, я начинаю очень сильно разбираться при синтаксическом анализе.
Моя текущая мысль - сломать вверх по пробелам, затем разбираю каждую, но затем я сталкиваюсь с пробелами в значениях, даже если они в кавычках Так что, если я сначала анализирую данные в кавычках, то пробелы для их восстановления кажется очень расточительным. Мне не нужно заново изобретать колесо, поэтому любые входные данные - это fantasti c.
example
[shortcodename key1 = "this is value" key2 = "34"]
хотел бы иметь
Array
(
[shortcodename] => Array
(
[key1] => this is a value
[key2] => 34
)</p>
<p>)
вот полная функция, которая работает, если кто-то еще хочет сделать то же самое, очевидно, что это не предназначено для запуска пользовательский контент, но вызываемая функция должна выполнять любые проверки, поскольку он заменяет шорткод, только если функция имеет возвращаемое значение.
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);
}
}
}
}
}