Я знаю, що це питання навколо 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;
}