web-dev-qa-db-fra.com

RegEx: Match nième occurrence

J'ai la chaîne suivante:

_name=aVlTcWRjVG1YeDhucWdEbVFrN3pSOHZ5QTRjOEJZZmZUZXNIYW1PV2RGOWYrczBhVWRmdVJTMUxYazVBOE8zQ3JNMmNVKzJLM2JJTzFON3FiLzFHUE0xY0pkdz09LS1jbkkwaWoxUUl3YVhMMkhtZHpaOW13PT0"%"3D--57356371d167f"

Je veux faire correspondre tout ce qui est entre = et la fin " (notez qu'il y a d'autres guillemets après cela, donc je ne peux pas simplement sélectionner le dernier ") .

J'ai essayé d'utiliser _name=(.*?)" mais il y a aussi d'autres guillemets dans la chaîne. Y a-t-il un moyen d'égaler la 3ème citation? J'ai essayé _name=(.*?)"{3} mais le {3} correspond aux guillemets, c.-à-d. """

Vous pouvez l'essayer ici

7
Bijan

Vous pouvez utiliser cette regex:

_name=(?:[^"]*"){3}

Démo RegEx

6
anubhava

Si vous voulez faire correspondre tout ce qui se trouve entre le premier et le troisième guillemet (!) (Le troisième n'est pas nécessairement le dernier, vous avez dit), vous pouvez utiliser un modèle comme celui-ci:

$string = '_name=foo"bar"test" more text"';
// This pattern will not include the last " (note the 2, not 3)
$pattern = '/_name=((.*?"){2}.*?)"/';

preg_match($pattern, $string, $m);
echo $m[1];

Sortie:

foo"bar"test

Réponse originale:

Je ne sais pas si je vous ai bien compris, mais il semblerait que vous souhaitiez effectuer ce que l'on appelle une correspondance gloutonne}, ce qui signifie que vous souhaitez faire correspondre la chaîne jusqu'au dernier ", que la chaîne contienne plusieurs "s.

Pour effectuer une correspondance gourmande, supprimez simplement le ?, comme ceci:

_name=(.*)"

Vous pouvez l'essayer ici: https://regex101.com/r/uC5eO9/2

1
hek2mgl