/ / Пошук HTML-тегів у рядку - php, html, regex, preg-match

Пошук HTML-тегів у рядку - php, html, regex, preg-match

Я знаю, що це питання навколо 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> що логічно, тому що інший має атрибути в іншому порядку.

Що regex мені потрібно, щоб отримати наступне 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 для відповіді № 1

Загальні поради: Не використовуйте Regex для аналізу 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");
}

4 для відповіді № 2

Як сказав 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;

}