从WordPress中提取属性,如短代码

时间:2013-07-24 11:22:22

标签: php regex

我有一个像WordPress短代码的字符串,需要提取属性。 :
[prefix action="foo" class="bar"][/prefix]

我需要保持这个结构,这意味着我不能删除引号成为action=foo

现在我使用WordPress正则表达式模式:

// Grabs [prefix foo="bar"][/prefix] from the $content
$pattern = '/\[(\[?)(' . PREFIX . ')(?![\w-])([^\]\/]*(?:\/(?!\])[^\]\/]*)*?)(?:(\/)\]|\](?:([^\[]*+(?:\[(?!\/\2\])[^\[]*+)*+)\[\/\2\])?)(\]?)/';
preg_match_all($pattern, $content, $matches, PREG_SET_ORDER);

这是结果:

Array
 (
     [0] => [prefix action="foo" class="bar"][/prefix]
     [1] => 
     [2] => prefix
     [3] =>  action="foo" class="bar"
     [4] => 
     [5] => 
     [6] => 
 )

然后我循环通过正则表达式匹配

foreach( $matches as $block )
    {
    /*
     * I'm not working on WordPress platform, 
     * But I used function shortcode_parse_atts
     */
    $attr = shortcode_parse_atts( $block[3] );

结果:

Array
(
    [action] => "foo"
    [class] => "bar"
)

最后extract($attr)。但正如您所看到的,$class$action值介于双引号之间。所以我需要获得这些报价。

简而言之:
我希望$class = "bar"成为$class = bar

如果您认为我不使用str_replacepreg_replace的原因,我做了但是它没有以某种方式删除引号(我不明白为什么)

2 个答案:

答案 0 :(得分:1)

这是你的属性数组; $array,如问题中的print_r()输出所示:

Array (
    [action] => "foo"
    [class] => "bar"
)

print_r()不输出引号,除非实际上有引号作为值的一部分,在这种情况下显然是这样。要删除引号,我们可以使用str_replace()array_map()函数,如下所示:

$clean = array_map(function($item) {
    return str_replace("\"", "", $item);
}, $array);

print_r($clean);

然后我们得到:

Array (
    [action] => foo
    [class] => bar
)

答案 1 :(得分:0)

如果您有类似的内容,

$array = array ( "action" => "\"foo\"", "class" => "\"bar\"" );

然后你可以使用(删除引号)

 $arr = array_map(function($i){ 
    return trim($i, '"'); 
}, $array);

但是,我想,要么我错过了解,要么你只是错过了解数组,这就是数组的工作方式,看看这个(如果你有这样的数组)

$array = array ( "action" => "foo", "class" => "bar" );
print_r($array);

结果是:

Array
(
    [action] => foo
    [class] => bar
)

现在看看这个

$arr = array_map(function($i){ 
    return trim($i, '"'); 
}, $array);
print_r($arr);

结果是:

Array 
(
    [action] => foo
    [class] => bar 
)

或者您可以将其测试为

extract($array);
echo $class; // barArray

因此,在这种情况下,quotes是包含string值的数组的一部分,在输出中,quotes将不可见。