DOMDocument veya SimpleXML HTML içine alırken satır içi öğeleri Çıkarma?

3 Cevap php

Ben kazıyın ve ya yerel bir XML dosyasına dönüştürmek veya bir MySQL DB eklemek istediğiniz harici bir HTML kaynak var.

Yapmam gereken tüm kullanım XPATH Tüm td içerik veya tüm li içerik almak için böylece dış kaynak, çoğunlukla normalize ve (biraz) anlamsal olduğunu vs sorun, bazen bu öğeler <strong> veya <b> veya <i> etiketleri ihtiyacım unsurları stil kullanmaktır.

Nokta belirli bir metne vurgu eklemek için olduğundan bu, teknik olarak semantik ve geliştirici tarayıcı varsayılan değil CSS kullanmak isteyebilirsiniz.

Sorun simplexml veya DOMDocument ve benzeri PHP uzantıları DOMNode tedavi böylece ben kapmak için çalışıyorum gerçek içeriği, bu satır içi elemanın bir çocuk olarak kabul olmasıdır gibi onları. Örneğin:

<table>
<tr><td>Thing 1</td><td>Thing 2</td></tr>
<tr><td>Thing 3</td><td>Thing 4</td></tr>
<tr><td><strong>Thing 5</strong></td><td><strong>Thing 6</strong></td></tr>
</table>

: Neden olacaktır

 [table] =>
    [tr] =>
        [td] => Thing 1
        [td] => Thing 2
    [tr] =>
        [td] => Thing 3
        [td] => Thing 4
    [tr] =>
        [td] => 
            [strong] => Thing 5
        [td] => 
            [strong] => Thing 6

Açıktır ki, yukarıdaki oldukça ne Basit XML döner değil, yukarıdaki genel sorunu yansıtır.

Yani bir yolu zaten DOMDocument yerleşik bir parametre kullanılarak ya da (eğer varsa) kendi soyundan statü elimden herhangi çocuklu td elemanın içeriğini almak için ekstra gelişmiş XPath sorgusu kullanarak, var ve tüm içerik sorgulanan elemanın metin olarak muamele?

Şu anda, ben tek çözüm ya şunlardır:

a) gibi, her sonuç denetleyen bir foreach döngü var:

$result_text = ($result -> strong) ? $result - strong : $result;

b) SimpleXML veya DOMDocument gibi herhangi bir pre-built sınıfa aktarmadan önce HTML dizesi dışında herhangi bir <strong> etiketleri şerit için regex kullanarak.

3 Cevap

Sadece strip_tags() ekstra biçimlendirme kaldırmak için kullanamaz mıyız?

$table = simplexml_load_string(
    '<table>
        <tr><td>Thing 1</td><td>Thing 2</td></tr>
        <tr><td>Thing 3</td><td>Thing 4</td></tr>
        <tr><td><strong>Thing 5</strong></td><td><strong>Thing 6</strong></td></tr>
    </table>'
);

foreach ($table->xpath('//td') as $td)
{
    $content = strip_tags($td->asXML());
    echo $content, "\n";
}

Sadece eğlence uğruna eğer, bir regex html ayrıştırma önce this için ilk cevabı okuyunuz. XPath yerine ayrıştırmak devam td metnini almak, cevaptır. Yani sadece //td gibi bir şey aramak ve yerine güçlü ya da ne söylemek yaprakları var ki ağaç bina devam (tamamen bunun sonuçlarını alacağım.

Eğer DOMDocument kullanıyorsanız eğer bir DOMNode, mülkiyet textContent bunun sadece yazı kısmını içermelidir ve childen hepsi ... exactly seçtikten sonra, sizin için ne sordu .

$table = '<table>
        <tr><td>Thing 1</td><td>Thing 2</td></tr>
        <tr><td>Thing 3</td><td>Thing 4</td></tr>
        <tr><td><strong>Thing 5</strong></td><td><strong>Thing 6</strong></td></tr>
    </table>';

$dom = new DOMDocument;
$dom->loadHTML($table);
$xpath = new DOMXPath($dom);

$els = $xpath->query('//td');
echo $els->item(4)->textContent; //Thing 5

Alternatif olarak, düğüm türüne bağlı olarak, nodeValue de kontrol edebilirsiniz. Ben tam olarak farkı hatırlamak, ama textContent ne istediğinizi olamaz.