7
votes

regex. Comment exclure une sous-chaîne du résultat après qu'il correspond au motif

Je me demande comment je peux exclure une sous-chaîne du résultat après qu'il correspond au schéma. Exemple: xxx

Je veux obtenir uniquement les chaînes passées comme paramètres à la fonction __ (). J'ai essayé cette regex: xxx

mais qui renvoie "string1" et "string2" enveloppé dans des guillemets simples et des citations doubles.
Comment puis-je exclure des citations simples et des citations doubles?


1 commentaires

Je parlais de manière privée avec @ Ahmedhelmy007 sur le problème, nous avons trouvé une autre solution qui doit utiliser la fonction Token_get_all () dans PHP. Ceci est plus précis que la regex et plus rapide.


4 Réponses :


2
votes
  • Utilisez (?:) de manière appropriée. Celles-ci sont pour regrouper que vous ne voulez pas capturer.
  • Si vous avez les citations à l'intérieur de la capture () , les guillemets seront inclus dans la capture. Si vous mettez les devis à l'extérieur, ils ne seront pas inclus.
  • vous avez plus () que nécessaire. | a la moindre priorité en association.
  • Vous vous échappez plus que ce dont vous avez besoin. Les citations n'ont pas besoin d'être escapées.
  • Puisque vous utilisez [^ '] et [^ "] , vous n'avez pas à spécifier pour des guillemets / des parens fermes.

    Un correctif serait comme: xxx


0 commentaires

4
votes

Vous voulez essayer d'utiliser des groupes non capturants - (?: abc)


0 commentaires

2
votes

Vous pouvez utiliser lookahead et lookbehind ou faire la chaîne à l'intérieur des citations d'un groupe .


0 commentaires

0
votes

Essayez ceci xxx

Vous pouvez le voir en ligne ici sur Regexr < / P>

Chaque fois que vous ouvrez un support rond, vous créez un groupe de capture. Donc, si vous ne voulez pas qu'il utilise (?:) cela définirait un groupe non capturant. Je n'utilise pas ça ici. J'ai un peu réécrivé votre regex. Dans mon premier groupe, je vérifie s'il y a ' ou " et stockez-les dans le groupe 1. Plus tard, j'utilise la correction \ 1 à ceci Groupe, pour utiliser le caractère correct.

Votre résultat est ensuite stocké toujours dans le groupe 2. Comment accéder à ce résultat dépend de votre langue utilisée.


6 commentaires

@ Systema, votre regex est très puissant, spécialement la correction, mais je ne pouvais pas le faire fonctionner correctement dans PHP !! J'utilise preg_match_all: preg_match_all ('/ __ ((((\' | ") ([^ \ 1] +) \ 1) / ', $ texte, $ Matchs); Je pense que la réveil a besoin de quelque chose pour fonctionner correctement dans la plage supports.


@ Ahmedhelmy007, je ne suis pas un spécialiste PHP, mais j'ai essayé un peu et il semble que vous ayez besoin d'échapper au ' et " alors essayez s'il vous plaît cette regex. ' / __ \ __ \ ((\ '| \ ") ([^ \ 1] +) \ 1 \) /'


@ Système, non, ce n'est pas un problème d'échappement


Tout Geik PHP pourrait me dire quel est le problème avec la brouillon ici? En bref, j'ai besoin de cela pour travailler: Preg_Match_All ('/ __ (((((\' | ") ([^ \ 1] +) \ 1 / '", "__ (" correspondre ")." Pas ceci' ", $ allumettes);


@ ahmedhelmy007, seules quelques personnes ne liront pas votre commentaire ici. Je suggérerais de soumettre une nouvelle question avec ce problème. Ajoutez également le code comment vous appelez la regex et comme étiquette php , je suis sûr que vous obtiendrez très vite de bonnes réponses.


@ Stema Thanx, j'ai ajouté cette question: Stackoverflow.com/Questtions/6050427/...