/ / "Reverse" Reihenfolge regex - nächste "über" Übereinstimmung - php, Regex

"Reverse" Reihenfolge Regex - nächste "über" Übereinstimmung - php, regex

Dies ist ein Beispiel für eine Zeichenfolge.

<div>other text</div> some text abc , <div>need_match_this</div> bbbb <p>hsa</p> aa <span>hello</span>

Ich kenne nur das Ende der Saite "<span>hello</span>" und ich muss Text in der nächsten "über" div übereinstimmen.

Ich habe diesen Regex verwendet:

<div>(.*?)</div>.*?<span>hello</span>

Aber das funktioniert nicht für mich, weil ich nur den Text des nächsten Divs zurückgeben muss, nicht das erste Div in der Zeichenfolge.

Gibt es eine Regex-Lösung, um das Problem zu lösen?

Bitte helfen Sie.

Vielen Dank

Antworten:

5 für die Antwort № 1

Sie müssen eine negative Lookahead-basierte Regex anstelle von Dazwischen verwenden .*?, schon seit .*? würde auch zum Öffnen oder Schließen passen div Stichworte.

<div>((?:(?!</?div>).)*?)</div>(?:(?!</?div>).)*?<span>hello</span>

DEMO

(?:(?!</?div>).)*? Erzwingt, dass die Regex-Engine mit einem beliebigen Zeichen übereinstimmt, jedoch nicht mit <div> oder </div>. Das heißt, vor dem Zuordnen jedes Zeichens würde diese Regex prüfen, ob dieses bestimmte Zeichen nicht das Anfangszeichen ist <div> oder </div> . Wenn ja, würde es diesem bestimmten Charakter entsprechen. Wenn nein, wird die Übereinstimmung abrupt abgebrochen und der folgende Charakter wird nicht gefunden.

Beispiel:

Schnur - <div></div>

Regex - <div>((?:(?!</?div>).)*?)</div>

Für diese Eingabe würde die oben erwähnte Regex die Leerzeichenkette zwischenDh die leere Zeichenfolge existiert zwischen dem Öffnen und Schließen div Stichworte). (?!</?div>). im obigen würde nach dem folgenden Zeichen suchen, das nicht ein beginnendes Zeichen in sein sollte <div> oder </div> aber das scheitert seit dem folgenden char < Das ist ein Star-Char </div>. Weil wir diesen bestimmten Regex so definiert haben, dass er null oder mehrmals wiederholt, (?:(?!</?div>).)*?, erfasst es die dazwischenliegende leere Zeichenfolge.