/ / Regex d'ordre "inversé" - correspondance "en haut" la plus proche - php, regex

Regex d'ordre "Reverse" - correspondance "au dessus" la plus proche - php, regex

Ceci est un exemple d'une chaîne.

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

Je ne connais que la fin de la ficelle "<span>hello</span>" et j'ai besoin de faire correspondre le texte dans le div le plus proche

J'ai utilisé cette regex:

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

Mais cela ne fonctionne pas pour moi car je dois renvoyer le texte de la division la plus proche uniquement, pas la première division de la chaîne.

Existe-t-il une solution regex pour résoudre ce problème?

S'il vous plaît aider.

Je vous remercie

Réponses:

5 pour la réponse № 1

Vous devez utiliser une expression rationnelle basée sur le lookahead négatif plutôt qu'entre .*?, depuis .*? correspondrait également à l'ouverture ou à la fermeture div Mots clés.

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

DEMO

(?:(?!</?div>).)*? oblige le moteur de regex à correspondre à n'importe quel caractère mais pas de <div> ou </div>. C'est-à-dire qu'avant de faire correspondre chaque caractère, cette expression rationnelle vérifiera si ce caractère particulier n'est pas le caractère de départ dans <div> ou </div> . Si oui, alors cela correspondrait à ce personnage. Si non, la correspondance échouera brusquement et le personnage suivant ne sera pas identifié.

Exemple:

chaîne - <div></div>

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

Pour cette entrée, la regex mentionnée ci-dessus capturerait la chaîne vide entre-deux (c'est-à-dire que la chaîne vide existe entre l'ouverture et la fermeture div Mots clés). (?!</?div>). dans ce qui précède serait vérifier le caractère suivant ne doit pas être un caractère de départ dans <div> ou </div> mais cela échoue car le caractère suivant est < qui est un personnage fixe dans </div>. Parce que nous avons défini cette expression rationnelle particulière pour répéter zéro ou plusieurs fois, (?:(?!</?div>).)*?, il capture la chaîne vide entre les deux.