更新 2023.3.12 16:16閲覧 921

【PHP】XPath で取りこぼしてしまうヤバすぎる「書き方」

<?
#このファイルのソース
echo '<div class="px-5 bg-dark text-white">';highlight_file(__FILE__);echo '</div>';

#こんな HTML タグがあったとして
$html = '<div class=cat>class cat</div>
<div class=dog id="cat">class dog id cat</div>
<img src="http://localhost/cat.gif" alt="src cat.gif">
<img data-lazy=test data-src="http://localhost/test-cat.gif" alt="data-src cat.gif">
<a id="TEST" href="//cat.com">id TEST href //cat.com</a>
<div class="test cat">class test cat</div>';

#こんな風にまとめて要素を指定して
$cat = '//*[contains(@class | @data-src | @src | @href | @id, "cat")]';
#DOM して
$dom = new DOMDocument();
$dom->loadHTML($html);
#XPath して
$xpath = new DOMXPath($dom);
echo 'BEFORE
<div class="px-5 py-3 bg-dark text-white">', hs($dom->saveHTML($dom->documentElement)), '</div>';
#一気に除去を試みると
foreach ($xpath->query($cat) as $a) if ($a) $a->parentNode->removeChild($a);
#こんな風に取りこぼすのは、除去したい要素よりも先に、「一致しない指定要素」があるから。完。
echo 'AFTER
<div class="px-5 py-3 bg-dark text-white">', hs($dom->saveHTML($dom->documentElement)), '</div>';
BEFORE
<html><body><div class="cat">class cat</div> <div class="dog" id="cat">class dog id cat</div> <img src="http://localhost/cat.gif" alt="src cat.gif"> <img data-lazy="test" data-src="http://localhost/test-cat.gif" alt="data-src cat.gif"> <a id="TEST" href="//cat.com">id TEST href //cat.com</a> <div class="test cat">class test cat</div></body></html>
AFTER
<html><body> <div class="dog" id="cat">class dog id cat</div> <a id="TEST" href="//cat.com">id TEST href //cat.com</a> </body></html>

コメント

当フォームより収集される個人情報は、返信を要する際に使用されるものであり、法令に基づく行政機関等への提供を除き、ご本人の同意を得ずに第三者に提供することはありません。また、コメントが掲載される場合であってもメールアドレスが本サイト内に記載されることはありません。