用户可以使用WYSIWYG为一段内容输入文本,该WYSIWYG放在变量$ body中。这可能包括style="[maybe stuff] height:xpx [maybe stuff]"
或height="xpx"
的多个实例。
我需要获取所有存在的高度值(仅限数字),以便我可以将它们一起添加。
请注意,字符串中可能还有其他整数值,因此它不能只抓取所有整数。
如果解决方案使用正则表达式,我从来没有理解它,我理解正则表达式存在安全问题,所以理想情况下我正在寻找一个安全的解决方案!
我确信这一定很简单,但我很挣扎!
答案 0 :(得分:2)
如果我没弄错的话,这应该可以解决问题:
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上松散(如果我没弄错的话),我会看at ways to parse the DOM并使用DOMElement's方法得到我想要的东西。这是一个更加强大的问题。
根据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
对于更多OO方法,我建议查看几个recursive domnode iterator classes。不鼓励通过引用传递数组,但这是获取所需内容的最简单方法。另一个版本是:
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);
答案 1 :(得分:2)
感谢大家的帮助! Elias Van Ootegem - 你的正则表达式工作得很好,但是我决定接受你解析DOM的建议。这是我用这种方式找到的解决方案 -
$dom = new DOMDocument();
$dom->loadHTML($body);
$xpath = new DOMXPath($dom);
$tags = $xpath->query('//div/@style');
$height = 'height:';
$totalheight = 0;
foreach ($tags as $tag) {
$str = trim($tag->nodeValue);
$height_str = strstr( $str, $height);
$totalheight = $totalheight + trim( substr( $height_str, strlen( $height), stripos( $height_str, 'px;') - strlen( $height)));
}
答案 2 :(得分:0)
我对正则表达式并不熟悉,但也许这会有用吗?
<?php
$message = 'Hello world <p style="height: 80 px;width:20px">Some example</p><br />Second: DERP DERP <p style="color:#000;height:30 px;padding:10px;"> DERP</p>';
preg_match_all('#height\s?:\s?[0-9]+\s?px#', $message, $results);
$heights = str_replace(array('height', ':', ' ', 'px'), '', $results[0]);
echo array_sum($heights);
?>