Hocker auf Kopf: PHP: preg_match_all - ich finde den Fehler nicht...

Hallo,

es ist spät Abends und ich scheine so richtig auf dem Schlauch zu stehen. Ich bekomme in einem PHP Script den folgenden String:

string(3457) "	<li class="cat-item cat-item-634"><a href="https://irgendwas.de/category/kommissare/kommissare-im-dienst/andersen-moormann-und-selb/">Andersen, Moormann und Selb</a>
</li>
	<li class="cat-item cat-item-434"><a href="https://irgendwas.de/category/kommissare/kommissare-im-dienst/ballauf-und-schenk/">Ballauf und Schenk</a>
</li>
	<li class="cat-item cat-item-48"><a href="https://irgendwas.de/category/kommissare/kommissare-im-dienst/batic-und-leitmayr/">Batic und Leitmayr</a>
</li>
	<li class="cat-item cat-item-613"><a href="https://irgendwas.de/category/kommissare/kommissare-im-dienst/berg-und-tobler/">Berg und Tobler</a>
</li>
	<li class="cat-item cat-item-555"><a href="https://irgendwas.de/category/kommissare/kommissare-im-dienst/berlinger/">Berlinger</a>
</li>
	<li class="cat-item cat-item-619"><a href="https://irgendwas.de/category/kommissare/kommissare-im-dienst/borowski-und-sahin/">Borowski und Sahin</a>
</li>
	<li class="cat-item cat-item-491"><a href="https://irgendwas.de/category/kommissare/kommissare-im-dienst/brix-und-janneke/">Brix und Janneke</a>
</li>
	<li class="cat-item cat-item-474"><a href="https://irgendwas.de/category/kommissare/kommissare-im-dienst/dorn-und-lessing/">Dorn und Lessing</a>
</li>
	<li class="cat-item cat-item-439"><a href="https://irgendwas.de/category/kommissare/kommissare-im-dienst/eisner-und-fellner/">Eisner und Fellner</a>
</li>
	<li class="cat-item cat-item-633"><a href="https://irgendwas.de/category/kommissare/kommissare-im-dienst/faber-boenisch-herzog-und-pawlak/">Faber, Bönisch, Herzog und Pawlak</a>
</li>
	<li class="cat-item cat-item-554"><a href="https://irgendwas.de/category/kommissare/kommissare-im-dienst/falke-und-grosz/">Falke und Grosz</a>
</li>
	<li class="cat-item cat-item-624"><a href="https://irgendwas.de/category/kommissare/kommissare-im-dienst/gorniak-und-winkler/">Gorniak und Winkler</a>
</li>
	<li class="cat-item cat-item-630"><a href="https://irgendwas.de/category/kommissare/kommissare-im-dienst/grandjean-und-ott/">Grandjean und Ott</a>
</li>
	<li class="cat-item cat-item-440"><a href="https://irgendwas.de/category/kommissare/kommissare-im-dienst/lannert-und-bootz/">Lannert und Bootz</a>
</li>
	<li class="cat-item cat-item-623"><a href="https://irgendwas.de/category/kommissare/kommissare-im-dienst/lindholm-und-schmitz/">Lindholm und Schmitz</a>
</li>
	<li class="cat-item cat-item-372"><a href="https://irgendwas.de/category/kommissare/kommissare-im-dienst/murot/">Murot</a>
</li>
	<li class="cat-item cat-item-625"><a href="https://irgendwas.de/category/kommissare/kommissare-im-dienst/odenthal-und-stern/">Odenthal und Stern</a>
</li>
	<li class="cat-item cat-item-486"><a href="https://irgendwas.de/category/kommissare/kommissare-im-dienst/rubin-und-karow/">Rubin und Karow</a>
</li>
	<li class="cat-item cat-item-628"><a href="https://irgendwas.de/category/kommissare/kommissare-im-dienst/schuerk-und-hoelzer/">Schürk und Hölzer</a>
</li>
	<li class="cat-item cat-item-430"><a href="https://irgendwas.de/category/kommissare/kommissare-im-dienst/thiel-und-boerne/">Thiel und Boerne</a>
</li>
	<li class="cat-item cat-item-466"><a href="https://irgendwas.de/category/kommissare/kommissare-im-dienst/tschiller-und-gumer/">Tschiller und Gümer</a>
</li>
	<li class="cat-item cat-item-487"><a href="https://irgendwas.de/category/kommissare/kommissare-im-dienst/voss-und-ringelhahn/">Voss und Ringelhahn</a>
</li>

Damit ich es schön als Array weiterverwursten kann, möchte ich es mit preg_match_all weiter demontieren:

	preg_match_all('|<li class="cat-item cat-item-(.*)">(.*)<a href="(.*)" title="(.*)">(.*)</a>(.*)</li>|Uism',$cat_list, $kommissar_array_unsauber, PREG_PATTERN_ORDER);

Doch das Ergebnis ist:

array(7) { [0]=> array(0) { } [1]=> array(0) { } [2]=> array(0) { } [3]=> array(0) { } [4]=> array(0) { } [5]=> array(0) { } [6]=> array(0) { } } 

Vielleicht ist auch schon zu spät für meine Rübe, aber ich sehe den Fehler nicht mehr.

  1. Oh man da habe ich ganz schön auf der Leitung gestanden <li class="cat-item cat-item-(.*)"><a href="(.*)">(.*)</a>(.*)</li> wäre es gewesen.

  2. Als kleine Randnotiz: Statt den vielen "faulen" Punkten (.* lazy durch U-flag) empfiehlt es sich, negierte Zeichenklassen zu verwenden wo immer möglich. Siehe z.B. dieses Regex101 Demo. Der U-modifier kommt dann weg, da er ja keinen gierigen Punkt mehr "einzubremsen" braucht.

    Auch das m multline flag brauchen wir nicht wirklich, da ja kein ^ oder $ vorkommt. Und da ja auch gar kein Punkt mehr vorkommt, hauen wir das s single-line flag auch noch raus. 😉

    ~<li class="cat-item cat-item-([^"]*)"><a href="([^"]*)">([^<]*)</a>([^<]*)</li>~i
    

    Dann hoffe ich mal, dass du eine erholsame Nachtruhe hast. 🌚

  3. @@Hocker auf Kopf

    <li class="cat-item cat-item-434"><a href="https://irgendwas.de/category/kommissare/kommissare-im-dienst/ballauf-und-schenk/">Ballauf und Schenk</a></li>
    <li class="cat-item cat-item-48"><a href="https://irgendwas.de/category/kommissare/kommissare-im-dienst/batic-und-leitmayr/">Batic und Leitmayr</a></li>
    

    So richtig sinnvoll ist das Markup aber nicht. Die Identifikatoren cat-item-{Nummer} sind doch wohl eindeutig? Also IDs, keine Klassen:

    <li class="cat-item" id="cat-item-434"><a href="https://irgendwas.de/category/kommissare/kommissare-im-dienst/ballauf-und-schenk/">Ballauf und Schenk</a></li>
    <li class="cat-item" id="cat-item-48"><a href="https://irgendwas.de/category/kommissare/kommissare-im-dienst/batic-und-leitmayr/">Batic und Leitmayr</a></li>
    

    Und wenn sämtliche Listitems derselben Klasse cat-item angehören, dann ist diese Klasse überflüssig.

    Wenn die Liste <ul class="cats"> ist, dann können die Listitems als .cats > li selektiert und gestylt werden.

    🖖 Живіть довго і процвітайте

    --
    „Im Vergleich mit Elon Musk bei Twitter ist ein Elefant im Porzellanladen eine Ballerina.“
    — @Grantscheam auf Twitter