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:
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"
3 Réponses :
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.
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
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
.
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).
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 عا٠ا
L'expression est expliquée en haut panneau de droite de cette démo si vous souhaitez l'explorer / la simplifier / la modifier.
$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"); }
\s+\p{N}{1,3}\s+(?:years?|an(?:née)?s|Ø³ÙØ©|سÙÙØ§Øª|عا٠ا|साल)