Autor Zpráva
glararan
Profil *
Zdravím.
Snažím se nakodovat parser, který bude hledat v body v příkladu
<dl>
<dt>
Název příkladu
</dt>
<dd>
Příklad
</dd>
...
...
</dl>

Vůbec netuším jak napsat preg_match pro dt s názvem Název příkladu a aby mě vypsal obsah dd, ikdyž je tam více v dl dt a dd aby vypsal pouze to kde je v prech matchu název příkladu.

Takže třeba
<dl>
<dt>
Název příkladu1
</dt>
<dd>
Příklad1
</dd>
<dt>
Název příkladu2
</dt>
<dd>
Příklad2
</dd>
</dl>

A pak použiju
preg_match(<dt>Název příkladu1</dt><dd>Teď něco nějaký ty znaky..</dd>, $curl, $matches)
echo $matches[1]; // Vypíše pouze ten příklad1 a dál to nepokračuje

Takhle nějak bych chtěl aby to fungovalo.. jenže já opravdu netuším jaký ty znaky do toho preg_matchu mám nacpat.
A ještě by mě bodlo jestli by to umělo H1 a <p>.
SeparateSK
Profil
použi preg_match_all:
<?php
    $text=file_get_contents("subor.html");
    $regexp="<dt>(.*)<\/dt>.*<dd>(.*)<\/dd>";
    if(preg_match_all("/$regexp/siU",$text,$vysledky,PREG_SET_ORDER)){
        foreach($vysledky as $vysledok){
            echo "To medzi DT: $vysledok[1]<br>";
            echo "To medzi DD: $vysledok[2]<br>";
        }
    }
?>
Ak chceš h1,tak zmeň:
$regexp="<dt>(.*)<\/dt>.*<dd>(.*)<\/dd>"; na $regexp="<h1>(.*)<\/h1>";
Joker
Profil
glararan:
Na tohle by byl daleko lepší HTML parser místo regulárních výrazů.

Ale jinak to co by mělo být místo „Teď něco nějaký ty znaky..“ je asi: .*?
Ovšem nebude to fungovat pro jakýkoliv kód tam může být, to ostatně zpracování HTML regulárními výrazy skoro nikdy. Proto jsem taky napsal tu první větu.
glararan
Profil *
SereparateSK
jde mi o to, že mezi DT dosadím já sám, aby to našlo ktomu DD a já potřebuju dostat jen výsledek z toho DD a další ostatní DT a DD zahodit.

Joker: Dělám v parsingu poprvé takže netuším co myslíš.


Omlouvám se za double, nemám učet

ale vyřešil jsem to, díky SereparateSK za tvoje znaky doplnil jsem je tam a vypsalo to.

Kod:
if (preg_match('/<dt>ObsahDT<\/dt>.*<dd>(.*)<\/dd>/siU', $response, $matches))
        echo $matches[1]; // obsah DD
SeparateSK
Profil
Takže chceš aby to zistilo, čo je medzi prvým <dd> a ďalšie <dd> nevypísalo?
<?php
    $text=file_get_contents("subor.html");
    $regexp="<dd>(.*)<\/dd>";
    preg_match("/$regexp/siU",$text,$vysledok);
    echo "$vysledok[1]<br>";
?>
Joker
Profil
glararan:
Joker: Dělám v parsingu poprvé takže netuším co myslíš.
Povídání: Proč parsovat HTML regulárními výrazy a ne parserem?
Asi hlavní faktor je, jak volně může být sestavený ten kontrolovaný kód. Jestli to generuje automat a je dané, že ten prvek třeba nikdy nebude mít atributy, nikdy v něm nebude nějaké složitější HTML a podobně, jsou regulární výrazy vcelku použitelné.

Naopak třeba „Vyhledej všechny <P> jejichž nejbližší předchozí sourozenec je <H1>“ mi přijde jako úkol pro HTML parser.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: