Я знаю, что этот вопрос вокруг SO, но я не могу найти правильный, и я все еще втягиваю Regex: /
У меня есть 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>')
Общий совет: не используйте регулярное выражение для анализа HTML. Это будет беспорядочно, если HTML изменится.
DOMDocument
этого используйте 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; }