Intereting Posts
PHP OOP :: передача ключа сеанса между классами Перенос устаревших пользователей на symfony2 Как переопределить существующее количество в корзине? Аутентификация (претензии) к Sharepoint / Office356 через PHP и SOAP Невозможно выполнить java-программу с помощью функции php exec Как преобразовать временную метку java в timestamp php? Проблемы с загрузкой нескольких файлов в Symfony2 Можно ли вставить тег комментария в xml с помощью simplexml? Как получить базу данных данных без перезагрузки страницы? Отслеживание электронной почты начинается с реального изображения Как проверить правильное доменное имя и поддомен в php как создать выбранную опцию из раскрывающегося списка? после установки magento на моей локальной машине я забыл пароль администратора PHP Неустранимая ошибка: вызов неопределенной функции json_decode () Точка с запятой после закрытия фигурной скобки в PHP

Поиск тегов HTML в строке

Я знаю, что этот вопрос вокруг 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; }