我有一个像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_replace
或preg_replace
的原因,我做了但是它没有以某种方式删除引号(我不明白为什么)
答案 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
将不可见。