1
votes

expression régulière php pour correspondre à 2 chiffres suivis de certains mots

Je souhaite détecter les chaînes comportant l'âge d'un utilisateur, par exemple:

"J'ai 24 ans" "J'ai 25 ans"

Donc, essentiellement, il chercherait:

  • commence zéro ou plusieurs caractères (n'importe quel)
  • suivi de deux chiffres - correspond aux chiffres arabes (0,1,2, etc.) et hindi (Ù, Ù¡, Ù ¢, etc.)
  • suivi de l'un des mots "âge" (années, ans, etc.)
  • se terminer par zéro ou plusieurs autres caractères (tous)

J'ai utilisé:

/^[0-9]{2} +(ans|year)$/

jusqu'à présent, mais cela ne correspond qu'à des chaînes très spécifiques comme "24 ans"


0 commentaires

3 Réponses :


1
votes

Une approche possible pourrait être

\b\p{N}+\s+(?:an|year)s?

qui pourrait être utilisée par exemple dans une anticipation. Voir une démo sur regex101.com .

Votre expression initiale utilise des ancres, c'est-à-dire que votre sous-chaîne ne peut être mise en correspondance qu'au début et à la fin.


3 commentaires

Merci qui fonctionne parfaitement pour les chiffres arabes / occidentaux (1, 2, 3, etc.). Comment pourrais-je également le faire correspondre aux chiffres hindi (qui sont déroutants les chiffres utilisés en arabe). stackoverflow.com/questions/29729391 /…


@SherifBuzz: Aha. Changé en \ p {N} qui doit correspondre à tous les chiffres de PCRE .


ne semble malheureusement pas fonctionner. J'ai mis à jour la démo: regex101.com/r/Re0J1Y/4



1
votes

Débarrassez-vous de ^ et $ . Ils correspondent au début et à la fin de la chaîne, donc cela ne fonctionnera pas si vous avez Je suis au début ou old à la fin.

Si vous le souhaitez pour faire correspondre des mots entiers, utilisez plutôt \ b .

/\b\d{2} +(ans|years)\b/

Et si vous voulez faire correspondre des chiffres autres que l'arabe, utilisez \ d au lieu de [0-9ITED.


1 commentaires

Si vous voulez que \ d contienne des chiffres autres que l'ASCII, vous devez utiliser le modificateur u (qui étend les classes de caractères abrégés en unicode et transforme les limites des mots \ b compatible Unicode). De plus, le modificateur u force le moteur regex à lire la chaîne point par point de code au lieu d'octet par octet (c'est le comportement par défaut).



0
votes

Je ne sais pas si j'ai choisi les bons mots, mais vous voudrez peut-être concevoir une expression similaire à:

24 years
25 ans
25 year
24  years
27 साल
25  ans
100  year
27 عاما

DEMO

L'expression est expliquée en haut panneau de droite de cette démo si vous souhaitez l'explorer / la simplifier / la modifier.

Test

$re = '/\s+\p{N}{1,3}\s+(?:years?|an(?:née)?s|سنة|سنوات|عاما|साल)/m';
$str = 'I\'m 24 years old
J\'ai 25 ans
I have 25 year
عندي ٢٣ سنة
I\'m  24  years old
मैं 27 साल का हूँ
J\'ai  25  ans
I have 100  year
أنا 27 عاما
عندي  ٢٣  سنة';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

foreach ($matches as $match) {
    print(trim($match[0]) . "\n");
}

Sortie

\s+\p{N}{1,3}\s+(?:years?|an(?:née)?s|سنة|سنوات|عاما|साल)


0 commentaires