在字符串中查找 HTML 标记


Finding HTML tags in string

我知道这个问题在SO周围,但我找不到合适的问题,我仍然在正则表达式中吸食:/

我有一个string,该字符串是有效的 HTML。现在我想找到所有具有特定nameattribute的标签。

我尝试了这个正则表达式(即带有类型的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>逻辑,因为另一个属性具有不同顺序的属性。

在示例字符串上使用preg_match时,我需要什么正则表达式才能获得以下array

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

一般建议:不要使用正则表达式来解析 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');
}

正如 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;
}