Hirdetés

Keresés

Új hozzászólás Aktív témák

  • Sk8erPeter

    nagyúr

    válasz Sleed #15863 üzenetére

    Nagyon egyszerű a dolog DOMDocument és DOMXPath használatával is, most meló utáni agypihentetőnek megcsináltam. :D Elég könnyű volt:

    A PHP-fájl, ami az átalakítást elvégzi:

    <?php
    $originalFilename = './test.html';
    $newFilename = './test_MODIFIED.html';
    $dom = new DOMDocument();
    $dom->loadHTMLFile($originalFilename);
    $xpath = new DOMXPath($dom);
    $nodes = $xpath->query("//table[@id='starwars-table']/tbody/tr/td");

    foreach ($nodes as $tdNode) {
    $anchorNode = $dom->createElement('a', $tdNode->nodeValue);
    $anchorNode->setAttribute('href', 'http://starwars.com/' . $tdNode->nodeValue . '-robot/' . strtolower($tdNode->nodeValue) . '.php');
    $anchorNode->setAttribute('target', '_blank');
    $tdNode->nodeValue = '';
    $tdNode->appendChild($anchorNode);
    }

    // Create new file
    //$dom->saveHTMLFile($newFilename);
    // Print output
    echo $dom->saveHTML();

    A tesztbemenet HTML-kódja, vagyis a kódban hivatkozott test.html tartalma:

    <!DOCTYPE html>
    <html>
    <head>
    <title>Asdasd</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
    <div>
    <table id="starwars-table">
    <thead>
    <tr>
    <th>Test table header 1</th>
    <th>Test table header 2</th>
    <th>Test table header 3</th>
    <th>Test table header 4</th>
    </tr>
    </thead>
    <tbody>
    <tr>
    <td>TR-25-A</td>
    <td>TR-25-B</td>
    <td>2-2-SA</td>
    <td>2-2-QWE</td>
    </tr>
    </tbody>
    </table>
    </div>
    </body>
    </html>

    A kód által előállított kimenet:

    <!DOCTYPE html>
    <html><head><title>Asdasd</title><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"></head><body>
    <div>
    <table id="starwars-table"><thead><tr><th>Test table header 1</th>
    <th>Test table header 2</th>
    <th>Test table header 3</th>
    <th>Test table header 4</th>
    </tr></thead><tbody><tr><td><a href="http://starwars.com/TR-25-A-robot/tr-25-a.php" target="_blank">TR-25-A</a></td>
    <td><a href="http://starwars.com/TR-25-B-robot/tr-25-b.php" target="_blank">TR-25-B</a></td>
    <td><a href="http://starwars.com/2-2-SA-robot/2-2-sa.php" target="_blank">2-2-SA</a></td>
    <td><a href="http://starwars.com/2-2-QWE-robot/2-2-qwe.php" target="_blank">2-2-QWE</a></td>
    </tr></tbody></table></div>
    </body></html>

    Kicsit összenyomja a kódot, de gondolom ez nem para, az elvártak szerint lesz így már linkelve a szöveg.
    Persze itt a táblázat azonosítója a starwars-table, ezt rögzítettem az XPath-ban.
    Arra figyelj, hogy itt a HTML-kódban megadtam az egyébként opcionális <tbody> taget is (amúgy érdemes használni, szemantikailag picit szebb a kód tőle, ha van fejléc is, akkor meg azt érdemes <thead>-be rakni, úgy főleg szépen elkülönül a törzstől), ezt az XPath-ban is rögzítettem, de ha nálad nincs <tbody> tag használva, akkor szedd ki az XPath-ból is a tbody/ részt.
    Ja, és kommentezve direkt odaraktam a $dom->saveHTMLFile($newFilename); sort is, amely a $newFilename változó tartalmában megadott névvel új dokumentumot hoz létre az új kimenettel (magyarul el tudod menteni másik fájlba a lecserélt változatot).

    Demonstrálás céljából felraktam neked ide a komplett kódot:

    http://ideone.com/iqvcKM

    Itt persze a sima loadHTML metódust használtam a loadHTMLFile helyett, mivel itt nem fájltartalmat töltök be.

Új hozzászólás Aktív témák