1

看看 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);
        }
      }
    }
  }
}
4

1 回答 1

2

你可以试试这个来改变所有没有用引号括起来的空格让我们说一个分号然后用分号爆炸

$regex = '~"[^"]*"(*SKIP)(*F)|\s+~';
$subject = 'hola hola "pepsi cola" yay';
$replaced = preg_replace($regex,";",$subject);
$exploded = explode(';', $replaced);

学分

于 2020-01-10T02:17:40.023 回答