2 votes

Php regex combiner liste répétée avec une seule occurrence et exclure des mots entiers

Je n'arrive pas avec certaines tâches regex dont j'ai besoin pour remplacer certaines informations textuelles.

La tâche suivante peut également être effectuée sans regex, mais ce serait bien de l'avoir en regex car il y a beaucoup à remplacer.

Cependant, la question est :

  • trouver des caractères dans l'ensemble [\w\. \&\=\?\-\(\)\'\+] qui peuvent apparaître 3 à 99 fois, donc écrire : [\w\. \&\=\?\-\(\)\'\+]{3-99}
  • A l'intérieur de la liste, un saut de ligne peut apparaître une fois, donc écrire \n?
  • après ces caractères, une chaîne fixe apparaît, donc écrire simplement :
  • mais à l'intérieur de la liste de caractères, le mot "for" ne doit pas apparaître

Donc si j'utilise : ((?!for)[\w\. \&\=\?\-\(\)\'\+]{3,99}|(\n?)) le mot 'for' sera ​​quand même trouvé. Quelqu'un a-t-il une idée ?

Donc par exemple : Dans cette chaîne :

    À : Lasse Erikson 

Je veux trouver le nom et l'e-mail.

Même ici :

À : Lasse Erikson , Sara
    Larsson 

Mais ici je ne veux rien récupérer :

 pour ; Thu, 14 Dec 2017 21:18:22 +0100 (CET)

Parce qu'il y a un "for" dans la ligne.

J'espère que vous avez compris cela...

Merci d'avance

1voto

revo Points 5311

PHP (PCRE) fournit quelques verbes pour sauter ou échouer au processus de correspondance actuel que vous pouvez utiliser pour sauter le mot for ou échouer à l'ensemble de la correspondance si vous le souhaitez:

((?(?=\bfor\b)for(*SKIP)(*F))[ \w.(&=?\-+)](?(2)|(\R)?)){3,99}<[^<>@]*@[^<>]*>

Démo en direct

Explication:

(   # Début du groupe de capture #1
    (?(?=\bfor\b)for(*SKIP)(*F))    # Sauter `for` si présent
    [ \w.(&=?\-+)]  # Correspondre avec des caractères autorisés
    (?(2)|(\R)?)    # Un caractère de nouvelle ligne entre
){3,99} # Entre 3 et 99 fois, fin du GC #1
<[^<>@]*@[^<>]*> # Correspondre avec un format d'email

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X