我有一个包含HTML属性的字符串:
$attribs = ' id= "header " class = "foo bar" style ="background-color:#fff; color: red; "';
如何将该字符串转换为索引数组,例如:
array(
'id' => 'header',
'class' => array('foo', 'bar'),
'style' => array(
'background-color' => '#fff',
'color' => 'red'
)
)
所以我可以使用PHP array_merge_recursive函数来合并两组HTML属性。
谢谢
答案 0 :(得分:20)
使用SimpleXML:
<?php
$attribs = ' id= "header " class = "foo bar" style ="background-color:#fff; color: red; "';
$x = new SimpleXMLElement("<element $attribs />");
print_r($x);
?>
这假设属性总是名称/值对...
答案 1 :(得分:8)
您可以使用正则表达式来提取该信息:
$attribs = ' id= "header " class = "foo bar" style ="background-color:#fff; color: red; "';
$pattern = '/(\\w+)\s*=\\s*("[^"]*"|\'[^\']*\'|[^"\'\\s>]*)/';
preg_match_all($pattern, $attribs, $matches, PREG_SET_ORDER);
$attrs = array();
foreach ($matches as $match) {
if (($match[2][0] == '"' || $match[2][0] == "'") && $match[2][0] == $match[2][strlen($match[2])-1]) {
$match[2] = substr($match[2], 1, -1);
}
$name = strtolower($match[1]);
$value = html_entity_decode($match[2]);
switch ($name) {
case 'class':
$attrs[$name] = preg_split('/\s+/', trim($value));
break;
case 'style':
// parse CSS property declarations
break;
default:
$attrs[$name] = $value;
}
}
var_dump($attrs);
现在你只需要解析class
的类(在空白处拆分)和style
的属性声明(稍微有点困难,因为它可以包含;
的注释和URL它)。
答案 2 :(得分:4)
您不能使用正则表达式来解析html属性。这是因为语法是上下文的。您可以使用正则表达式来标记输入,但是您需要一个状态机来解析它。
如果性能不是很大,最安全的方法就是将属性包装在标签中,然后通过html解析器发送。例如:
function parse_attributes($input) {
$dom = new DomDocument();
$dom->loadHtml("<foo " . $input. "/>");
$attributes = array();
foreach ($dom->documentElement->attributes as $name => $attr) {
$attributes[$name] = $node->value;
}
return $attributes;
}
您可以通过重复使用解析器,或使用XmlReader或sax parser来优化上述内容。
答案 3 :(得分:2)
可能这会对你有所帮助.. 它的作用......
答案 4 :(得分:2)
简单的方法也可以:
$atts_array = current((array) new SimpleXMLElement("<element $attribs />"));
答案 5 :(得分:0)
一个简单有效的功能来解决这个问题
function attrString2Array($attr) {
$atList = [];
if (preg_match_all('/\s*(?:([a-z0-9-]+)\s*=\s*"([^"]*)")|(?:\s+([a-z0-9-]+)(?=\s*|>|\s+[a..z0-9]+))/i', $attr, $m)) {
for ($i = 0; $i < count($m[0]); $i++) {
if ($m[3][$i])
$atList[$m[3][$i]] = null;
else
$atList[$m[1][$i]] = $m[2][$i];
}
}
return $atList;
}
print_r(attrString2Array('<li data-tpl-classname="class" data-tpl-title="innerHTML" disabled nowrap href="#" hide src = "images/asas.gif">'));
print_r(attrString2Array('data-tpl-classname="class" data-tpl-title="innerHTML" disabled nowrap href="#" hide src = "images/asas.gif"'));
//Array
//(
// [data-tpl-classname] => class
// [data-tpl-title] => innerHTML
// [disabled] =>
// [nowrap] =>
// [href] => #
// [hide] =>
// [src] => images/asas.gif
//)