正则表达式转换版本错误
regular expression convert version wrong
嘿社区我有一个问题我正在使用正则表达式而不是得到完整版本我得到以下 _3 我应该得到 13_3
这就是我使用表达式的方式 -
$useragent = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148";
$pattern = '/os ([0-9]?.[0-9]?[0-9]?[0-9]?[0-9])*/';
preg_match($pattern,strtolower($useragent),$m);
这就是我将它用于 Android -
的方式
$useragent = "Mozilla/5.0 (Linux; Android 8.1.0; moto e5 play Build/OPGS28.54-53-8-11; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/80.0.3987.162 Mobile Safari/537.36";
$pattern = '/android ((\d+|\.).[^ ,);]+)/';
preg_match($pattern,strtolower($useragent),$m);
我做错了什么?
您可以使用
preg_match('/os\s+([0-9]+(?:_[0-9]+)*)/i', $useragent, $m)
参见regex demo。
os
- 一个字符串
\s+
- 1+ 个空格
([0-9]+(?:_[0-9]+)*)
- 捕获第 1 组:
[0-9]+
- 1+ 位数
(?:_[0-9]+)*
- _
和 1+ 个数字出现 0 次或多次。
见PHP demo:
$useragent = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148";
if (preg_match('/os\s+([0-9]+(?:_[0-9]+)*)/i', $useragent, $m)) {
print_r($m);
}
在您的模式中,您没有考虑可能的下划线。
这部分 [0-9]?.[0-9]?[0-9]?[0-9]?[0-9]
匹配一个可选数字,除换行符外的任何字符后跟 3 个可选数字和一个可能也匹配的数字,例如 x1
您获得值 _13
因为您正在重复捕获本身,捕获最后一次迭代的值。
作为替代方案,您也可以使用 \K
清除匹配缓冲区并仅获取匹配项。
\bos\h+\K\d+(?:_\d+)*\b
\b
字边界
os
字面匹配
\h+\K
匹配 1+ 个水平空白字符,然后忘记匹配的是什么
\d+(?:_\d+)*
匹配 1+ 位可选地由 _ 和 1+ 位重复的数字
\b
字边界
例如
$useragent = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148";
$pattern = '/\bos\h+\K\d+(?:_\d+)*\b/';
preg_match($pattern,strtolower($useragent),$m);
print_r($m[0]);
输出
13_3
preg_match('/os ([0-9].(?:_?[0-9]+)+)*/gi',$useragent,$m);
这将是代码:
$useragent = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_33 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148";
if (preg_match('/os ([0-9].(?:_?[0-9]+)+)*/', $useragent, $m)) {
var_dump($m);
}
第一组输出:
13_3_33
嘿社区我有一个问题我正在使用正则表达式而不是得到完整版本我得到以下 _3 我应该得到 13_3
这就是我使用表达式的方式 -
$useragent = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148";
$pattern = '/os ([0-9]?.[0-9]?[0-9]?[0-9]?[0-9])*/';
preg_match($pattern,strtolower($useragent),$m);
这就是我将它用于 Android -
的方式$useragent = "Mozilla/5.0 (Linux; Android 8.1.0; moto e5 play Build/OPGS28.54-53-8-11; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/80.0.3987.162 Mobile Safari/537.36";
$pattern = '/android ((\d+|\.).[^ ,);]+)/';
preg_match($pattern,strtolower($useragent),$m);
我做错了什么?
您可以使用
preg_match('/os\s+([0-9]+(?:_[0-9]+)*)/i', $useragent, $m)
参见regex demo。
os
- 一个字符串\s+
- 1+ 个空格([0-9]+(?:_[0-9]+)*)
- 捕获第 1 组:[0-9]+
- 1+ 位数(?:_[0-9]+)*
-_
和 1+ 个数字出现 0 次或多次。
见PHP demo:
$useragent = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148";
if (preg_match('/os\s+([0-9]+(?:_[0-9]+)*)/i', $useragent, $m)) {
print_r($m);
}
在您的模式中,您没有考虑可能的下划线。
这部分 [0-9]?.[0-9]?[0-9]?[0-9]?[0-9]
匹配一个可选数字,除换行符外的任何字符后跟 3 个可选数字和一个可能也匹配的数字,例如 x1
您获得值 _13
因为您正在重复捕获本身,捕获最后一次迭代的值。
作为替代方案,您也可以使用 \K
清除匹配缓冲区并仅获取匹配项。
\bos\h+\K\d+(?:_\d+)*\b
\b
字边界os
字面匹配\h+\K
匹配 1+ 个水平空白字符,然后忘记匹配的是什么\d+(?:_\d+)*
匹配 1+ 位可选地由 _ 和 1+ 位重复的数字\b
字边界
例如
$useragent = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148";
$pattern = '/\bos\h+\K\d+(?:_\d+)*\b/';
preg_match($pattern,strtolower($useragent),$m);
print_r($m[0]);
输出
13_3
preg_match('/os ([0-9].(?:_?[0-9]+)+)*/gi',$useragent,$m);
这将是代码:
$useragent = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_33 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148";
if (preg_match('/os ([0-9].(?:_?[0-9]+)+)*/', $useragent, $m)) {
var_dump($m);
}
第一组输出:
13_3_33