【问题标题】:Convert string shortcodes to array without wordpress function将字符串短代码转换为没有 wordpress 功能的数组
【发布时间】:2017-06-11 11:08:35
【问题描述】:

我有一个包含多个这样的短代码的字符串:

// string contain multi shortcode
$string = '[code_1]
[code_2 attr_2="test2"]Here2[/code_2]
[code_3 attr_3="test3"]Here3[/code_3]
[code_4 attr_4="test4"]
    [code_4_1 attr_41="test41"]Here41[/code_4_1]
    [code_4_2 attr_42="test42"]Here42[/code_4_2]
[/code_4]';

我有一个包含短代码名称的列表键数组:

// list key
$list_key = array(
        'code_1',
        'code_2',
        'code_3',
        'code_4',
        'code_4_1',
        'code_4_2',
    );

如何生成以下数组?

array(
    array(
        "name" => "code_1",
    ),
    array(
        "name" => "code_2",
        "attr" => array(
            "attr_2" => "test2"
        ),
        "content" => "Here2",
    ),
    array(
        "name" => "code_3",
        "attr" => array(
            "attr_3" => "test3"
        ),
        "content" => "Here3",
    ),
    array(
        "name" => "code_4",
        "attr" => array(
            "attr_4" => "test4"
        ),
        "content" => array(
            array(
                "name" => "code_4_1",
                "attr" => array(
                    "attr_41" => "test41"
                ),
                "content" => "Here41",
            ),
            array(
                "name" => "code_4_2",
                "attr" => array(
                    "attr_42" => "test42"
                ),
                "content" => "Here42",
            )
        ),
    )
);

我想在 Wordpress 之外执行此操作。我该怎么做?

【问题讨论】:

    标签: php regex wordpress parsing shortcode


    【解决方案1】:

    首先,有很多方法可以做到这一点。
    其次,您应该已将您的编码尝试与您的问题一起发布(但我假设您不知道如何解决它)
    第三,我编写了一个方法,它将获取您的样本输入(字面意思)并产生您想要的输出(字面意思)。

    从正则表达式模式开始,当捕获的值中存在符号或换行符时,可能会出现问题。我不想在每次问题编辑后都陷入多个答案编辑中。我希望您能够修改我的答案以满足您的特定需求。将来,在寻求基于正则表达式的解决方案时,当您提供至少 2 或 3 个不同的实际输入进行测试时,您将获得更高质量的答案。

    (Pattern Demo)
    代码(PHP Demo):

    $in='[code_1]
    [code_2 attr_2="test2"]Here2[/code_2]
    [code_3 attr_3="test3"]Here3[/code_3]
    [code_4 attr_4="test4"]
        [code_4_1 attr_41="test41"]Here41[/code_4_1]
        [code_4_2 attr_42="test42"]Here42[/code_4_2]
    [/code_4]';
    
    preg_match_all('/\[(code_\d+)(_\d+)?(?: (attr_\d+)="([^"]*)")?\](.+(?=\[\/\1\2?\]))?/',$in,$out,PREG_SET_ORDER);
    $i=0;
    foreach($out as $sc){
        if(!empty($sc[2]) && ($parent_i=array_search($sc[1],array_column($out,1)))!==false){
            // store child data in parent's content array
            $shortcodes[$parent_i]['content'][]=['name'=>$sc[1].$sc[2],'attr'=>[$sc[3]],'content'=>$sc[4]];
        }else{
            $tmp=['name'=>$sc[1]];                // declare a fresh tmp array
            if(isset($sc[3]) && isset($sc[4])){
                $tmp['attr']=[$sc[3]=>$sc[4]];    // store attr if available
            }
            if(isset($sc[5])){
                $tmp['content']=$sc[5];           // if text, store string
            }elseif(sizeof(array_keys(array_column($out,0),$sc[1]))){  // look for content or children
                $tmp['content']=[];               // if parent, declare empty array
            }
            $shortcodes[$i]=$tmp;                 // store built $tmp array
            ++$i;
        }
    }
    var_export($shortcodes);
    // output as desired by OP
    

    【讨论】:

    • 我的代码使用 preg_match_all,但我找不到正确的正则表达式方式,然后我不发布我的代码。谢谢你的帮助,但是当有嵌套短代码和多属性时有一些小错误,比如$in='[code_1] [code_2 attr_2="test2"]Here2[/code_2] [code_3 attr_3="test3"]Here3[/code_3] [code_4 attr_4="test4"] [code_4_1 attr_41="test41"]Here41[/code_4_1] [code_4_2 attr_42="test42"]Here42[/code_4_2] [code_4_3 attr_43="test43"][code_4_4 attr_43="test44"]Here44[/code_4_4][/code_4_3] [/code_4]';
    • @DeLe 就像我预测到了这个结果。我无法读心。我只能使用发布的问题信息编写解决方案。请花几天时间尝试理解我的回答并做出调整。
    猜你喜欢
    • 1970-01-01
    • 2016-02-03
    • 2013-03-26
    • 2016-11-03
    • 2015-01-06
    • 1970-01-01
    • 2021-02-23
    • 2020-02-14
    • 2019-06-13
    相关资源
    最近更新 更多