J'essaie d'analyser les chaînes encodées par URL qui sont composées de paires clé = valeur séparées par &
ou &
.
Ce qui suit ne correspondra qu'à la première occurrence, en séparant les clés et les valeurs en éléments de résultat distincts:
var result = mystring.match(/(?:&|&)?([^=]+)=([^&]+)/)
Les résultats pour la chaîne '1111342 = Adam% 20Franco & 348572 = Bob% 20Jones' seraient:
['1111342', 'Adam%20Franco']
L'utilisation de l'indicateur global, 'g', correspondra à toutes les occurrences, mais ne retournera que les sous-chaînes entièrement correspondantes, pas les clés et les valeurs séparées:
var result = mystring.match(/(?:&|&)?([^=]+)=([^&]+)/g)
Les résultats pour la chaîne '1111342 = Adam% 20Franco & 348572 = Bob% 20Jones' seraient:
['1111342=Adam%20Franco', '&348572=Bob%20Jones']
Bien que je puisse diviser la chaîne &
et séparer chaque paire clé / valeur individuellement, existe-t-il un moyen d'utiliser le support des expressions régulières de JavaScript pour faire correspondre plusieurs occurrences du modèle /(?:&|&)?([^=]+)=([^&]+)/
similaire à la preg_match_all()
fonction PHP ?
Je cherche un moyen d'obtenir des résultats avec les sous-matchs séparés comme:
[['1111342', '348572'], ['Adam%20Franco', 'Bob%20Jones']]
ou
[['1111342', 'Adam%20Franco'], ['348572', 'Bob%20Jones']]
la source
replace
ici.var data = {}; mystring.replace(/(?:&|&)?([^=]+)=([^&]+)/g, function(a,b,c,d) { data[c] = d; });
terminé. "matchAll" en JavaScript est "replace" par une fonction de gestionnaire de remplacement au lieu d'une chaîne.Réponses:
Tiré des commentaires
La prise en charge du navigateur est répertoriée ici https://caniuse.com/#feat=urlsearchparams
Je suggérerais une expression régulière alternative, utilisant des sous-groupes pour capturer le nom et la valeur des paramètres individuellement et
re.exec()
:result
est un objet:Le regex se décompose comme suit:
la source
x = y
attribueraity
àx
et produire égalementy
). Lorsque nous appliquons ces connaissances àif (match = re.exec(url))
: Ceci A) fait la tâche et B) renvoie le résultat dere.exec(url)
auwhile
.re.exec
Retourne maintenantnull
s'il n'y a pas de correspondance, ce qui est une valeur erronée. Donc, en fait, la boucle continuera tant qu'il y aura une correspondance.Vous devez utiliser le commutateur «g» pour une recherche globale
la source
2020 Modifier
Utilisez URLSearchParams , car ce travail ne nécessite plus aucun type de code personnalisé. Les navigateurs peuvent le faire pour vous avec un seul constructeur:
rendements
Il n'y a donc plus de raison d'utiliser regex pour cela.
Réponse originale
Si vous ne voulez pas vous fier à la "correspondance aveugle" qui accompagne la
exec
correspondance des styles en cours d'exécution , JavaScript est fourni avec une fonctionnalité de correspondance complète intégrée, mais cela fait partie de l'replace
appel de fonction, lorsque vous utilisez un "que faire avec la capture fonction de gestion des groupes :terminé.
Au lieu d'utiliser la fonction de gestion du groupe de capture pour renvoyer réellement des chaînes de remplacement (pour la gestion du remplacement, le premier argument est la correspondance de modèle complète, et les arguments suivants sont des groupes de capture individuels), nous prenons simplement les captures des groupes 2 et 3, et mettons en cache cette paire.
Ainsi, plutôt que d'écrire des fonctions d'analyse complexes, rappelez-vous que la fonction «matchAll» en JavaScript est simplement «remplacer» par une fonction de gestion de remplacement, et que la correspondance de modèles peut être très efficace.
la source
something "this one" and "that one"
. Je veux placer toutes les chaînes entre guillemets dans une liste, c'est-à-dire [celle-ci, celle-là]. Jusqu'à présent, celamystring.match(/"(.*?)"/)
fonctionne bien pour détecter le premier, mais je ne sais pas comment adapter votre solution à un seul groupe de capture.Pour capturer des groupes, j'ai l'habitude d'utiliser
preg_match_all
en PHP et j'ai essayé de reproduire sa fonctionnalité ici:la source
/g
sinon l'exécutionexec()
ne changera pas l'index actuel et bouclera indéfiniment.Définissez le
g
modificateur pour une correspondance globale:la source
Source:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec
Trouver des correspondances successives
Si votre expression régulière utilise l'indicateur "g", vous pouvez utiliser la méthode exec () plusieurs fois pour rechercher des correspondances successives dans la même chaîne. Lorsque vous procédez ainsi, la recherche commence à la sous-chaîne de str spécifiée par la propriété lastIndex de l'expression régulière (test () avancera également la propriété lastIndex). Par exemple, supposons que vous ayez ce script:
Ce script affiche le texte suivant:
Remarque: ne placez pas le littéral d'expression régulière (ou le constructeur RegExp) dans la condition while ou cela créera une boucle infinie s'il y a une correspondance en raison de la réinitialisation de la propriété lastIndex à chaque itération. Assurez-vous également que l'indicateur global est défini ou une boucle se produira ici également.
la source
String.prototype.match
avec leg
drapeau:'abbcdefabh'.match(/ab*/g)
retours['abb', 'ab']
Si quelqu'un (comme moi) a besoin de la méthode de Tomalak avec prise en charge des tableaux (c.-à-d. Sélection multiple), la voici:
contribution
?my=1&my=2&my=things
résultat
1,2,things
(précédemment renvoyé uniquement: choses)la source
Pour vous en tenir à la question proposée comme indiqué par le titre, vous pouvez en fait parcourir chaque correspondance dans une chaîne en utilisant
String.prototype.replace()
. Par exemple, ce qui suit fait exactement cela pour obtenir un tableau de tous les mots basé sur une expression régulière:Si je voulais obtenir des groupes de capture ou même l'index de chaque correspondance, je pourrais le faire aussi. Ce qui suit montre comment chaque correspondance est renvoyée avec la correspondance entière, le premier groupe de capture et l'index:
Après avoir exécuté ce qui précède,
words
sera comme suit:Afin de faire correspondre plusieurs occurrences similaires à ce qui est disponible en PHP,
preg_match_all
vous pouvez utiliser ce type de réflexion pour créer la vôtre ou utiliser quelque chose commeYourJS.matchAll()
. YourJS définit plus ou moins cette fonction comme suit:la source
YourJS.parseQS()
( yourjs.com/snippets/56 ), bien que de nombreuses autres bibliothèques offrent également cette fonctionnalité.Si vous pouvez vous en tirer, voici
map
une solution en quatre lignes:Ce n'est pas joli, ce n'est pas efficace, mais au moins c'est compact. ;)
la source
Utilisez
window.URL
:la source
Bonjour à partir de 2020. Permettez-moi de porter String.prototype.matchAll () à votre attention:
Les sorties:
la source
Pour capturer plusieurs paramètres en utilisant le même nom, j'ai modifié la boucle while dans la méthode de Tomalak comme ceci:
contribution:
?firstname=george&lastname=bush&firstname=bill&lastname=clinton
Retour:
{firstname : ["george", "bill"], lastname : ["bush", "clinton"]}
la source
?cinema=1234&film=12&film=34
je m'y attendais{cinema: 1234, film: [12, 34]}
. A modifié votre réponse pour refléter cela.Eh bien ... j'ai eu un problème similaire ... Je veux une recherche incrémentielle / étape avec RegExp (par exemple: démarrer la recherche ... faire un traitement ... continuer la recherche jusqu'à la dernière correspondance)
Après de nombreuses recherches sur Internet ... comme toujours (cela devient une habitude maintenant), je me retrouve dans StackOverflow et j'ai trouvé la réponse ...
Ce qui n'est pas référencé et il est important de le mentionner est "
lastIndex
" Je comprends maintenant pourquoi l'objet RegExp implémente lalastIndex
propriété " "la source
Le fractionner semble être la meilleure option pour moi:
la source
Pour éviter l'enfer des regex, vous pourriez trouver votre première correspondance, couper un morceau puis essayer de trouver le suivant sur la sous-chaîne. En C #, cela ressemble à quelque chose comme ça, désolé de ne pas l'avoir porté en JavaScript pour vous.
la source