私が間違っていなければ、これでうまくいくはずです:
preg_match_all('/height(\:|\=)"*\s*([0-9]+[^;"]+);*/i','<tr style="height: 123px; border: none;><tr height="125px"',$matches);
var_dump($matches[2]);//array('123px','125px');
しかし、この正規表現を HTML で解き放つつもりなので (私が間違っていなければ)、DOMを解析し、 DOMElement のメソッドを使用して必要なものを取得する方法を検討します。これは、問題に対するはるかに堅牢な取り組みです。
OPの要求に応じて:
function getDeepChildren($node,&$nodeArray)
{//recursive function to flatten dom
$current = $node->getElementsByTagName('*');//get all children
foreach($current as $node)
{//loop through children
$nodeArray[] = $node;//add child
if ($node->hasChildNodes())
{//if child node has children of its own
getDeepChildren($node,$nodeArray);//get the children and append to nodeArray
}
}
}//no return value, $nodeArray is passed by reference
$dom = new DOMDocument();
$dom->loadHTML($body);
$nodes = array();
getDeepChildren($dom,$nodes);//$nodes is passed by reference
$height = array();
while($node = array_shift($nodes))
{//$height[i][0] === height value, $height[i][1] is reference to node
if ($node->hasAttribute('height'))
{
$height[] = array($node->getAttribute('height'),$node);
continue;//already got what we need, no need for slow preg_match
//in case of <div height="123px" style="border:1px solid #F00;"> for example...
}
if ($node->hasAttribute('style') && preg_match('/height\s*\:\s*([0-9]+\s*[a-z]+)\s*;/i',$node->getAttribute('style'),$match))
{
$height[] = array($match[1],$node);
}
}
var_dump($height);//should contain everything you're looking for
よりオブジェクト指向のアプローチについては、いくつかの再帰的な domnode iterator クラスを検討することをお勧めします。
配列を参照渡しすることはお勧めしませんが、ここで必要なものを取得する最も簡単な方法です。別のバージョンは次のようになります。
function getDeepChildren($node)
{
$nodes = array();
$current = $node->getElementsByTagName('*');
foreach($current as $node)
{
$nodes[] = $node;
if ($node->hasChildNodes())
{
$nodes = array_merge($nodes,getDeepChildren($node));
}
}
return $nodes;
}
//instead of getDeepChildren($dom,$nodes), usage is:
$nodes = getDeepChildren($dom);