5

私はこの質問がSOの周りにあることを知っていますが、正しいものを見つけることができず、まだ正規表現を吸っています:/

その文字列は有効なstringHTML です。nameここで、特定のandを持つすべてのタグを見つけたいと思いますattribute

私はこの正規表現を試しました(つまり、タイプのdiv)/(<div type="my_special_type" src="(.*?)<\/div>)/:.

文字列の例:

<div>Do not match me</div>
<div type="special_type" src="bla"> match me</div>
<a>not me</a>
<div src="blaw" type="special_type" > match me too</div>

preg_match を使用する<div type="special_type" src="bla"> match me</div>と、論理的なものだけが得られます。これは、他の属性が異なる順序で属性を持っているためです。

arrayサンプル文字列で使用する場合、次の正規表現を取得する必要がありpreg_matchますか?:

array(0 => '<div type="special_type" src="bla"> match me</div>',
      1 => '<div src="blaw" type="special_type" > match me too</div>')
4

2 に答える 2

17

一般的なアドバイス: HTML の解析に正規表現を使用しないでください。HTML が変更されると、面倒になります..

DOMDocument代わりに使用してください:

$str = <<<EOF
<div>Do not match me</div>
<div type="special_type" src="bla"> match me</div>
<a>not me</a>
<div src="blaw" type="special_type" > match me too</div>
EOF;

$doc = new DOMDocument();
$doc->loadHTML($str);    
$selector = new DOMXPath($doc);

$result = $selector->query('//div[@type="special_type"]');

// loop through all found items
foreach($result as $node) {
    echo $node->getAttribute('src');
}
于 2013-09-14T10:37:54.477 に答える
5

hek2msql が言ったように、DOMDocument を使用することをお勧めします

$html = '
<div>Do not match me</div>
<div type="special_type" src="bla"> match me</div>
<a>not me</a>
<div src="blaw" type="special_type" > match me too</div>';

$matches = get_matched($html);


function get_matched($html){
    $matched = array();

    $dom = new DOMDocument();
    @$dom->loadHtml($html);

    $length = $dom->getElementsByTagName('div')->length;

    for($i=0;$i<$length;$i++){
        $type = $dom->getElementsByTagName("div")->item($i)->getAttribute("type");

        if($type != 'special_type')
            continue;

        $matched[] = $dom->getElementsByTagName("div")->item($i)->getAttribute('src');
    // or   $matched[] = $dom->getElementsByTagName("div")->item($i)->nodeValue;

    }

    return $matched;

}
于 2013-09-14T10:47:39.323 に答える