2013-09-14 3 views
0

Я знаю, что этот вопрос вокруг SO, но я не могу найти правильную и я все еще сосать в Regex:/Нахождение HTML-теги в строке

У меня есть string и эта строка является действительной HTML. Теперь я хочу найти все теги с определенными name и 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>') 
+1

, если он является действительным HTML вы не можете использовать [PHP DOM] (http://php.net/manual/en/book.dom.php)? Я не рекомендую использовать 'preg_ *' для HTML – bansi

ответ

4

Общий совет: Dont использовать регулярные выражения для разбора 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'); 
} 
+0

Спасибо за быстрый ответ! Я принял другой вопрос, потому что тот зациклился на найденных узлах. –

+1

@Sven Знайте, что цикл в PHP медленный. Использование «XPath» - это, безусловно, способ пойти сюда, особенно если HTML больше, чем показано в вопросе. test it – hek2mgl

+0

Можете ли вы привести мне пример того, как перебирать найденные элементы из '$ result'? Потому что я не могу найти такой метод, как 'items()' или что-то, и у меня есть несколько тегов в html, которые я хочу найти. –

4

Как hek2 Msql сказал, что лучше использовать 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; 

} 
+0

Это болтовня. Вы действительно предлагаете перебирать узлы вместо использования XPATH ?? Кажется, вы не поняли, что сказал hek2mgl. – hek2mgl

+0

Я никогда не говорил «вместо использования XPATH», конечно, он мог использовать XPATH. – Kilise

+1

Спасибо за ответ! –

Смежные вопросы