preg_match falsches end DIV

  • Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

webana

Mitglied
19 März 2012
154
5
18
Im Allgäu
Hallo,

möchte mit preg_match ein teil einer Seite auslesen. Das mache ich mit
PHP:
preg_match('/<div id="function.(.+)" class="refentry">(.+)<\/div>/Uis', $page, $content);
Leider nimmt der mir aber das Falsche End-DIV und hab somit nicht den eigentlichen Content. Laut PsPad passt das aber mit den DIVs.

Woran kann das leigen bzw. was kann ich dagegen machen?

Gruß Alex
 

Aaron3219

Senior HTML'ler
6 Oktober 2015
1.147
237
63
19
Könntest du mal einen Teil der Seite reinschicken und markieren, welchen Teil du auslesen möchtest? Ich würde da gerne selber mal ein wenig herumprobieren.
 

webana

Mitglied
19 März 2012
154
5
18
Im Allgäu
Hallo, das von PHP Manual. Hab mal 10 Seiten angehängt. Im Prinzip alles innerhalb von
HTML:
<div id="function.*-----Funktion-----*" class="refentry">

Viel Erfolg.
 

Anhänge

  • _pages.zip
    29,7 KB · Aufrufe: 2

Aaron3219

Senior HTML'ler
6 Oktober 2015
1.147
237
63
19
Alles klar. Scheint so, als wenn nach diesem div, welches du capturen willst, immer sowas wie
HTML:
<hr />
<div class="manualnavbar" style="text-align: center;">
kommt.

Das kannst du dir zunutze machen. Ich habe mit einem "positive lookahead" gearbeitet:
Code:
(?:<div id="function.(?:.+)" class="refentry">)(.+)(?=<hr \/>(?:[\n\s]+)?<div class="manualnavbar")

Wenn dir der Browser-Support ausreicht, kannst du auch einfach mit named capture groups arbeiten:
Code:
(?:<div id="function.(?:.+)" class="refentry">)(?<content_des_divs>.+)(?=<hr \/>(?:[\n\s]+)?<div class="manualnavbar")

Das macht es meiner Meinung nach ein wenig einfacher damit später die matches abzufragen.

Bei Fragen gerne Nachfragen.



Aber hier mit RegEx zu arbeiten ist meiner Meinung nach ein wenig zu unsicher und überkompliziert. Warum parst du den String nicht als HTML-Code und interagierst dann direkt per JS mit dem DOM-Element?
 
  • Like
Reaktionen: webana

tk1234

Mitglied
2 September 2020
64
17
8
Nein, der Gegenvorschlag ist mit DOM-Funktionen zu arbeiten - und das ist auch der einzig sinnvolle Weg, reguläre Ausdrücke sind nicht immer sinnvoll.
 

Aaron3219

Senior HTML'ler
6 Oktober 2015
1.147
237
63
19
Oh oh, hier sind wohl ein paar Missverständnisse vorhanden. Du hast recht, JS ist clientseitig! So wie es sich anhört, möchtest du serverseitig den Content mit PHP, bzw. RegEx, auslesen, um es an den Client zu schicken, der es dann wiederum als HTML parst.
Mit Browser Support meinst Du Client-Seitig
Damit meinte ich den Browser-Support für named capture groups bei RegEx-Ausdrücken.

Client-Seitig? Nein davon bin ich kein freund wenn es nicht sein muss.
Was spricht denn dagegen?

Ich bleibe dabei, du musst es eh als HTML-Code parsen, dann parse den ganze String und arbeite mit JS damit. Aber letztendlich musst du das ja selber wissen.
 

Rayse

Mitglied
26 Dezember 2009
62
0
6
Nein, der Gegenvorschlag ist mit DOM-Funktionen zu arbeiten - und das ist auch der einzig sinnvolle Weg, reguläre Ausdrücke sind nicht immer sinnvoll.
Man muss sich nicht zwangsweise durch die DOM-Elemente hangeln, nur weil es deiner Meinung nach der einzig sinnvolle Weg ist. In der IT führen viele Wege nach Rom und wenn es für seinen Anwendungsfall funktioniert ist das völlig in Ordnung.
 

Aaron3219

Senior HTML'ler
6 Oktober 2015
1.147
237
63
19
Man muss sich nicht zwangsweise durch die DOM-Elemente hangeln, nur weil es deiner Meinung nach der einzig sinnvolle Weg ist. In der IT führen viele Wege nach Rom und wenn es für seinen Anwendungsfall funktioniert ist das völlig in Ordnung.
Eigentlich würde ich diesen Thread gar nicht so gerne wieder aufleben lassen. Das Problem scheint für @webana ja gelöst worden zu sein, ob nun mit einer optimalen oder nicht optimalen Lösung.

Dennoch ein kurzer Kommentar: Ja, viele Wege führen nach Rom, aber nicht jeder ist der optimale Weg.
Wir kennen den Anwendungsfall von webana nicht, trotzdem ist das "extrahieren" von HTML-Code mittels RegEx in den alltermeisten Fällen kein optimaler Weg und eignet sich meiner Meinung nach nur, um RegEx zu lernen.

Mir scheint es eher so, als wenn hier aus Bequemlichkeit und Halbwissen eine der Lösungen genommen wurde, die wahrscheinlich nicht optimal ist. Und das kann man auch in einem Forum durchaus kritisieren.
 
Werbung: