如何使用PHP DOMDocument获取属性键而不是值

时间:2013-03-28 14:41:05

标签: php domdocument

我有一个html字符串

$html_string = '<div style="font-family:comic sans ms,cursive;">
<div style="font-size:200%;">Some Text </div></div>';

我试过了

$dom = new DOMDocument;
$dom->loadHTML($html_string);
$divs = $dom->getElementsByTagName('div');

for($i=0;$i<$divs->length;$i++) {
$attrib = $divs->item($i)->getAttribute("style");
echo $attrib;
echo '<br />';
}

它提供以下输出

font-family:comic sans ms,cursive
font-size:200%;

我需要

font-family
font-size

我怎样才能获得这些键而不是他们拥有的值?

3 个答案:

答案 0 :(得分:1)

你可以使用正则表达式来做到这一点。像这样:

$style = 'font-family:comic sans ms,cursive;font-size:15em';
preg_match_all('/(?<names>[a-z\-]+):(?<params>[^;]+)[; ]*/', $style, $matches);

var_dump($matches['names']);
var_dump($matches['params']);

结果:

array
  0 => string 'font-family' (length=11)
  1 => string 'font-size' (length=9)

array
  0 => string 'comic sans ms,cursive' (length=21)
  1 => string '15em' (length=4)

这甚至适用于多个css参数

答案 1 :(得分:1)

使用CSS解析器!

explode和正则表达式的所有答案本质上都是错误的。这是您尝试分析的CSS源代码。简单的文本操作永远不会正确地执行。例如。 background-image:url('http://my.server.com/page?a=1;b=2'); list-style-image:url('http://my2.server.com/page/a=1;b=2')完全有效,包含两个属性background-imagelist-style-image,大多数文本处理都会失败,因为文本中间有分号或4个冒号(两者都会被错误指示4个属性的不良解决方案。)

一般来说,永远不要尝试在源代码中摆弄文本操作工具;不是CSS,也不是HTML,也不是其他任何源代码。语言设计比这更复杂。这就是解析器要完成的目标,这也就是为什么它们很大 - 或者至少比strpos()更复杂......

答案 2 :(得分:0)

在当前输出上使用explode,然后继续使用从爆炸中收到的第一个元素