J'essaie de mettre en majuscule les "mots" qui ont au moins un chiffre, une lettre et un caractère spécial comme un point ou un tiret.
Des choses comme: 3370.01b , 6510.01.b , m-5510.30 et drm-2013-c-004914.
Je ne veux pas qu'il corresponde des choses comme: bonjour , sk8 et mixed-up
J'essaye d'utiliser des lookaheads, comme suggéré , mais je ne peux pas obtenir il correspond à n'importe quoi.
$output = preg_replace_callback('/\b(?=.*[0-9]+)(?=.*[a-z]+)(?=.*[\.-]+)\b/i', function($matches){return strtoupper($matches[0]);}, $input);
3 Réponses :
Je ne pense pas que vous n'ayez jamais rien capturé à mettre en correspondance ...
3370.01B foo
Sortie
$input = '3370.01b foo';
$output = preg_replace_callback('/(?=.*[0-9])(?=.*[a-z])(\w+(?:[-.]\w+)+)/i', function($matches){return strtoupper($matches[0]);}, $input);
echo $output;
Votre solution correspond également aux chaînes aaa-ddd 111-222 qui selon OP ne doivent pas correspondre car le mot doit contenir au moins un chiffre et un alphabet dans le mot. Vérifiez ceci
Vous pouvez utiliser cette expression régulière pour faire correspondre les chaînes de votre choix,
3370.01B, 6510.01.B, M-5510.30, and DRM-2013-C-004914 hello, sk8, and mixed-up
Explication:
(? = \ S * [a-z]) - Cette vue en avant garantit qu'il y a au moins un caractère alphabétique dans le mot entrant (? = \ S * \ d) - Cette vue en avant garantit qu'il y a au moins un chiffre dans le mot entrant [az \ d] + (?: [.-] [az \ d] +) + - Cette partie capture un mot contenant un mot alphanumérique contenant au moins un caractère spécial . ou - Voici la démo du code PHP modifiant votre code,
$input = '3370.01b, 6510.01.b, m-5510.30, and drm-2013-c-004914 hello, sk8, and mixed-up';
$output = preg_replace_callback('/(?=\S*[a-z])(?=\S*\d)[a-z\d]+(?:[.-][a-z\d]+)+/i', function($matches){return strtoupper($matches[0]);}, $input);
echo $output;
Prints,
(?=\S*[a-z])(?=\S*\d)[a-z\d]+(?:[.-][a-z\d]+)+
Expression régulière:
https://regex101.com/r/sdmlL8/1 a>
$input = '3370.01b';
$output = preg_replace_callback('/(?=.*\d)(.*)([-.])(.*)/i', function($matches){return strtoupper($matches[0]);}, $input);
Code PHP:
(?=.*\d)(.*)([-.])(.*)
Selon OP, il ne doit pas correspondre si le mot contient uniquement un nombre et il doit également contenir un alphabet.