2

ユーザーは、変数 $body に配置される WYSIWYG を使用してコンテンツのテキストを入力できます。style="[maybe stuff] height:xpx [maybe stuff]"これには、またはの複数のインスタンスが含まれる場合がありますheight="xpx"

存在するすべての高さの値 (数値のみ) を取得して、それらを合計できるようにする必要があります。

文字列内に他の整数値が存在する可能性があるため、すべての整数を取得できないことに注意してください。

ソリューションが正規表現を使用している場合、私はそれを理解できず、正規表現にはセキュリティ上の問題があることを理解しているので、理想的には安全なソリューションを探しています!

私はこれが非常に単純でなければならないと確信していますが、私は苦労しています!

4

3 に答える 3

3

私が間違っていなければ、これでうまくいくはずです:

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);
于 2012-10-22T10:13:09.933 に答える
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)));

} 
于 2012-10-22T11:01:37.107 に答える
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);

?>
于 2012-10-22T10:25:28.080 に答える