Html gelen stil etiketiyle Resimleri Kaldır Regex

3 Cevap php

Ancak ben bunu yapmam gereken ne kolay yol verdi, Regex yeni duyuyorum. Temelde ben = görüntüleme tarzını herhangi etiketlerini kaldırmak istiyorum ... HTML kodunu bir bütün yükü içerir (PHP) bir dizesi vardır: hiçbiri ...

Bu nedenle, örneğin

<img src="" style="display:none" />

<img src="" style="width:11px;display: none" >

vs ..

Şimdiye kadar benim Regex olduğunu:

<img.*style=.*display.*:.*none;.* >

Ama bu arkasında html bit bırakmak ve aynı zamanda preg_replace ile php kullanıldığında uzak bir sonraki eleman almak gibi görünüyor.

3 Cevap

Like Michael pointed out, bu amaç için Regex kullanmak istemiyorum. Bir Regex bir öğe etiketi ne olduğunu bilmiyor. Bunu farkı öğretmek sürece <foo> >foo< olarak anlamlıdır. Farkı öğretmek olsa inanılmaz derecede sıkıcı.

DOM çok daha uygundur:

$html = <<< HTML
<img src="" style="display:none" />
<IMG src="" style="width:11px;display: none" >
<img src="" style="width:11px" >
HTML;

Yukarıdaki (geçersiz) biçimlendirme. Biz bu gibi DOM onu beslemek:

$dom = new DOMDocument();
$dom->loadHtml($html);
$dom->normalizeDocument();

Şimdi metin "ekran" içeren bir "stil" özniteliği içeren tüm "IMG" elemanları için DOM sorgulayabilirsiniz. XPath'daki: "hiçbiri ekran", ama bizim giriş biçimlendirme inbetween hiçbir boşluk tekrarlarını vardır Biz sorgulamak olabilir:

$xpath = new DOMXPath($dom);
foreach($xpath->query('//img[contains(@style, "display")]') as $node) {
    $style = str_replace(' ', '', $node->getAttribute('style'));
    if(strpos($style, 'display:none') !== FALSE) {
        $node->parentNode->removeChild($node);
    }
}

Biz IMG düğümler üzerinde yineleme ve kendi stili özniteliği içerikten tüm boşlukları kaldırın. Sonra biz "display: none" içeriyorsa, kontrol ve eğer öyleyse, DOM öğeyi kaldırın.

Şimdi biz sadece HTML kaydetmek gerekir:

echo $dom->saveHTML();

bize verir:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><img src="" style="width:11px"></body></html>

Vida Regex!


Zeyilname: Ayrıca Parsing XML documents with CSS selectors ilginizi çekebilir

<img> içinde herhangi bir diğer unsurlar izin vermemesi nedeniyle, bu mümkündür; ama genel olarak, regexp HTML gibi bir kopyada tanımlanmış dil ayrıştırma için iyice kötü bir araçtır.

Neyse, muhtemelen vuruyorlar sorun kapanış>. * Ifadelerin biri tarafından eşleşen olduğunu ve sizin açık> eşleşecek hattında> sonraki bir olması umulur.

Eğer değiştirin tüm. * Tarafından [^>] * Bunu önlemek olacaktır. (Muhtemelen all de öldürürsün değiştirilmesi gerekir, ama yok).

Düzenli ifade yolu çok geniştir; .* "her şey maç" anlamına gelir, bu yüzden bu maç olacaktır:

<img src="foo.png" style="something">Some random displayed text : foo none; bar<br>

En azından, muhtemelen maçlarda kapanış parantez dışlamak istiyorum, bu yüzden [^>]* yerine .*. Ayrıca olsa da, this okumak, ve DOMDocument gibi, aslında HTML anlayan bir şey kullanarak içine bakmak isteyebilirsiniz