5 votes

Regex php séparer un mot exact d'une chaîne dans des groupes différents

Je ai essayé tout ce que je sais mais je ne peux toujours pas résoudre ce problème :

Je ai une chaîne d'ex :

  • "--included-- in selling price: 5 % vat usd 10.00 packaging fees 2 % notifying fees"
  • "--not included-- in selling price: us$ 35.00 express fees 2 % notifying fees"

Je veux savoir si les taxes sont "incluses" ou "exclues" et si les frais sont "%" ou "devise" le problème est qu'il ne détecte pas la devise "usd" alors qu'elle est attachée au nom de la taxe "vat usd"

Comment puis-je séparer la devise du nom de la taxe en différents groupes.

voici ce que j'ai fait

(--excluded--|--included--|--not included--)([a-z ]*)?:?(usd | aed | mad | € | us\$ )?([ \. 0-9 ]*)(%)?([a-z A-z ?]*) (aed|mad|€|us\$)*((aed|mad|€|us\$)+)?([\. 0-9 ]*)(%)?([a-z A-z]*)(.*)?

et voici ce que j'ai obtenu

Match 1
Full match  0-83    --included-- in selling price: 5 % vat usd 10.00 packaging fees 2 % notifying fees

Group 1.    0-12    --included--

Group 2.    12-29    in selling price

Group 4.    30-33    5 

Group 5.    33-34   %

Group 6.    34-42    vat usd

Group 10.   43-49   10.00 

Group 12.   49-64   packaging fees 

Group 13.   64-82   2 % notifying fees

et voici ce que je veux

Match 1
Full match  0-83    --included-- in selling price: 5 % vat usd 10.00 packaging fees 2 % notifying fees

Group 1.    0-12    --included--

Group 2.    12-29    in selling price

Group 4.    30-33    5 

Group 5.    33-34   %

Group 6.    34-38    vat

Group 7.    38-42    usd

Group 10.   43-49   10.00 

Group 12.   49-64   packaging fees 

Group 13.   64-82   2 % notifying fees

2voto

Wiktor Stribiżew Points 100073

Voici la solution:

$s = "--inclus-- dans le prix du produit: petit-déjeuner --exclu--: 5 % tva aed 10,00 frais de destination par nuit 2 % taxe municipale 3,5 % frais d'emballage 10 % frais de service de garantie";
$results = [];
if (preg_match_all('~(--(?:(?:pas )?dans|ex)clus--)(?:\s+([a-zA-Z ]+))?:+\s*((?:(?!--(?:(?:pas )?dans|ex)clus--).)*)~su', $s, $m, PREG_SET_ORDER, 0)) {
    foreach ($m as $v) {
        $lastline=array_pop($v); // Supprimer le dernier élément //print_r($details);
        if (preg_match_all('~(?:(\b(?:usd|aed|mad|usd)\b|\B€|\bus\$)\s*)?\d+(?:\.\d+)?(?:(?!(?1))\D)*~ui', $lastline, $details)) {
            $results[] = array_merge($v, $details[0]);
        } else {
            $results[] = $v;
        }
    }
}
print_r($results);

Voir le démonstration PHP.

Remarques:

Le premier regex extrait chaque correspondance que vous devez analyser. Voir la première démo regex. Cela signifie:

  • (--(?:(?:pas )?dans|ex)clus--) - Groupe 1: une version abrégée de (--exclus--|--inclus--|--pas inclus--): --exclu--, --inclus-- ou --pas inclus--
  • (?:\s+([a-zA-Z ]+))? - une séquence facultative: 1+ espaces et ensuite Groupe 2: 1+ lettres ASCII ou espaces
  • :+ - 1 ou plusieurs deux-points
  • \s* - 0+ espaces
  • ((?:(?!--(?:(?:pas )?dans|ex)clus--).)*) - Groupe 3: n'importe quel caractère, 0+ occurrences, autant que possible, ne débutant pas par l'une des trois séquences de caractères: --exclu--, --inclus--, --pas inclus--

Ensuite, il faut analyser davantage la valeur du Groupe 3 pour obtenir tous les détails. Le deuxième regex est utilisé ici pour correspondre

  • (?:(\b(?:usd|aed|mad|usd)\b|\B€|\bus\$)\s*)? - une occurrence facultative de
    • (\b(?:usd|aed|mad|usd)\b|\B€|\bus\$) - Groupe 1:
      • \b(?:usd|aed|mad|usd)\b - usd, aed, mad ou usd comme des mots entiers
      • \B€ - non précédé d'un caractère de mot
      • \bus\$ - us$ non précédé d'un caractère de mot
    • \s* - 0+ espaces
  • \d+
  • (?:\.\d+)? - une séquence facultative de . et 1+ chiffres
  • (?:(?!(?1))\D)* - n'importe quel caractère non-numérique, 0 ou plusieurs occurrences, autant que possible, ne débutant pas par le même motif que dans le Groupe 1

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