Je vais bien avec les expressions régulières de base, mais je me perds un peu en pos/neg look ahead/behinds.en utilisant regex pour passer devant tous les caractères jusqu'à ce qu'une séquence spécifique de lettres soit trouvée en utilisant la tête de lecture négative
J'essaie de tirer le id # de ceci:
[keyword stuff=otherstuff id=123 morestuff=stuff]
Il pourrait y avoir des quantités illimitées de « trucs » avant ou après. Je l'ai utilisé le Regex Coach pour aider debug ce que je l'ai essayé, mais je ne suis pas aller de l'avant plus ...
Jusqu'à présent, j'ai ceci:
\[keyword (?:id=([0-9]+))?[^\]]*\]
qui prend en charge tous les attributs supplémentaires après l'ID, mais je ne peux pas comprendre comment ignorer tout entre mot-clé et ID. Je sais que je ne peux pas y aller [^id]*
Je crois que je dois utiliser un lookahead négatif comme celui-ci (?!id)*
mais je suppose que, puisque c'est la largeur nulle, il ne va pas de l'avant à partir de là. Cela ne fonctionne pas non plus:
\[keyword[A-z0-9 =]*(?!id)(?:id=([0-9]+))?[^\]]*\]
Je l'ai cherchée partout des exemples, mais n'ai pas trouvé. Ou peut-être que j'ai, mais ils sont allés si loin sur ma tête que je ne savais même pas ce qu'ils étaient.
Aide! Merci.
EDIT: Il doit également correspondre à [keyword stuff = otherstuff], où id = n'existe pas du tout, donc je dois avoir un 1 ou 0 sur le groupe id #. Il y a aussi d'autres [otherkeywords id = 32] que je ne veux pas faire correspondre. Le document doit correspondre à plusieurs [mot-clé id = 3] dans les documents en utilisant preg_match_all.
Les solutions fournies fonctionnent très bien et se comparent probablement plus rapidement que n'importe quel type de lookahead, je vais certainement le faire de cette façon. Mais pour ma propre curiosité, et peut-être quelqu'un qui répond à cette question avec google dans un avenir lointain, est la méthode que j'ai essayé de rendre possible? Autrement dit, est-ce que les lookaheads peuvent être utilisés pour sauter des trucs jusqu'à ce qu'un mot particulier soit frappé? – phazei