我正在尝试大写具有至少一个数字,字母和特殊字符(例如,句号或破折号)的“单词”。
类似3370.01b
,6510.01.b
,m-5510.30
和drm-2013-c-004914
之类的东西。
我不希望它与hello
,sk8
和mixed-up
之类的东西匹配
我正在尝试使用前瞻性as suggested,但无法匹配任何内容。
$output = preg_replace_callback('/\b(?=.*[0-9]+)(?=.*[a-z]+)(?=.*[\.-]+)\b/i', function($matches){return strtoupper($matches[0]);}, $input);
答案 0 :(得分:2)
您可以使用此正则表达式匹配所需的字符串,
(?=\S*[a-z])(?=\S*\d)[a-z\d]+(?:[.-][a-z\d]+)+
说明:
(?=\S*[a-z])
-这种前瞻性确保输入的单词中至少有一个字母字符(?=\S*\d)
-这种前瞻性确保输入的单词中至少有一个数字[a-z\d]+(?:[.-][a-z\d]+)+
-该部分捕获包含字母数字的单词,该单词包含至少一个特殊字符.
或-
这是修改您的代码的PHP代码演示,
$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;
打印
3370.01B, 6510.01.B, M-5510.30, and DRM-2013-C-004914 hello, sk8, and mixed-up
答案 1 :(得分:0)
我认为您从未捕获任何可放入比赛的东西...
$input = '3370.01b foo';
$output = preg_replace_callback('/(?=.*[0-9])(?=.*[a-z])(\w+(?:[-.]\w+)+)/i', function($matches){return strtoupper($matches[0]);}, $input);
echo $output;
输出
3370.01B foo
答案 2 :(得分:0)
正则表达式:
https://regex101.com/r/sdmlL8/1
(?=.*\d)(.*)([-.])(.*)
PHP代码:
$input = '3370.01b';
$output = preg_replace_callback('/(?=.*\d)(.*)([-.])(.*)/i', function($matches){return strtoupper($matches[0]);}, $input);