Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中使用regex进行iOS检测_Php_Regex - Fatal编程技术网

在PHP中使用regex进行iOS检测

在PHP中使用regex进行iOS检测,php,regex,Php,Regex,我来到这里,通过useragent搜索iOS 6嗅探的答案,在这里找到了一个很好的答案: 我以前使用过的所有正则表达式都非常简单,我正在努力让它正常工作。不幸的是,PHP解析器没有给我任何错误 事实上,我知道我做错了什么,因为我在笔记本电脑上运行firefox时得到了下面代码的匹配 如果有人能给我指出正确的方向,我将不胜感激,我不知道我做错了什么 $subject = $_SERVER['HTTP_USER_AGENT']; $pattern = '~^(?:(?:(?:Mozilla/\d.\

我来到这里,通过useragent搜索iOS 6嗅探的答案,在这里找到了一个很好的答案:

我以前使用过的所有正则表达式都非常简单,我正在努力让它正常工作。不幸的是,PHP解析器没有给我任何错误

事实上,我知道我做错了什么,因为我在笔记本电脑上运行firefox时得到了下面代码的匹配

如果有人能给我指出正确的方向,我将不胜感激,我不知道我做错了什么

$subject = $_SERVER['HTTP_USER_AGENT'];
$pattern = '~^(?:(?:(?:Mozilla/\d.\d\s*()+|Mobile\s*Safari\s*\d+.\d+(.\d+)?\s*)(?:iPhone(?:\s+Simulator)?|iPad|iPod);\s*(?:U;\s*)?(?:[a-z]+(?:-[a-z]+)?;\s*)?CPU\s* (?:iPhone\s*)?(?:OS\s*\d+\d+(?:\d+)?\s*)?(?:like|comme)\s*Mac\s*O?S?\s*X(?:;\s*[a-z]+(?:-[a-z]+)?)?)\s*)?(?:AppleWebKit/\d+(?:.\d+(?:.\d+)?|\s*+)?\s*)?(?:(KHTML,\s*(?:like|comme)\s*Gecko\s*)\s*)?(?:Version/\d+.\d+(?:.\d+)?\s*)?(?:Mobile/\w+\s*)?(?:Safari/\d+.\d+(.\d+)?)?.*$~';

if (preg_match($pattern,$subject))
{
    echo "match";
}
请尝试以下方法:

^(?:(?:(?:Mozilla/\d\.\d\s*\()+|Mobile\s*Safari\s*\d+\.\d+(\.\d+)?\s*)(?:iPhone(?:\s+Simulator)?|iPad|iPod);\s*(?:U;\s*)?(?:[a-z]+(?:-[a-z]+)?;\s*)?CPU\s*(?:iPhone\s*)?(?:OS\s*\d+_\d+(?:_\d+)?\s*)?(?:like|comme)\s*Mac\s*O?S?\s*X(?:;\s*[a-z]+(?:-[a-z]+)?)?\)\s*)?(?:AppleWebKit/\d+(?:\.\d+(?:\.\d+)?|\s*\+)?\s*)?(?:\(KHTML,\s*(?:like|comme)\s*Gecko\s*\)\s*)?(?:Version/\d+\.\d+(?:\.\d+)?\s*)?(?:Mobile/\w+\s*)?(?:Safari/\d+\.\d+(\.\d+)?.*)?$
演示:


一个更通用的解决方案:

正则表达式有一些错误。由于字符转义系统的存在,一些元字符已经消失

以下是您问题的PHP代码更新:

$subject = $_SERVER['HTTP_USER_AGENT'];
$pattern = '~^(?:(?:(?:Mozilla/\d\.\d\s*\()+|Mobile\s*Safari\s*\d+\.\d+(\.\d+)?\s*)(?:iPhone(?:\s+Simulator)?|iPad|iPod);\s*(?:U;\s*)?(?:[a-z]+(?:-[a-z]+)?;\s*)?CPU\s*(?:iPhone\s*)?(?:OS\s*\d+_\d+(?:_\d+)?\s*)?(?:like|comme)\s*Mac\s*O?S?\s*X(?:;\s*[a-z]+(?:-[a-z]+)?)?\)\s*)?(?:AppleWebKit/\d+(?:\.\d+(?:\.\d+)?|\s*\+)?\s*)?(?:\(KHTML,\s*(?:like|comme)\s*Gecko\s*\)\s*)?(?:Version/\d+\.\d+(?:\.\d+)?\s*)?(?:Mobile/\w+\s*)?(?:Safari/\d+\.\d+(?:\.\d+)?.*)?$~';

if (preg_match($pattern,$subject))
{
    echo "match";
}

什么是
var_转储($_SERVER['HTTP_USER_AGENT')输出?@nickb显然取决于我使用的设备/浏览器,但在我笔记本电脑上的Firefox中:string(83)“Mozilla/5.0(Macintosh;Intel Mac OS X 10.8;rv:15.0)Gecko/20100101 Firefox/15.0.1”不应该匹配它!明显地关键是正则表达式是错误的——它确实与用户代理匹配,但显然它不是正确的行为。@nickb Ack,我根据这个家伙在回复中提供的细节和说明认为它工作正常@nickb,尤其是当该用户将其检查为正确答案时警告:preg_match()[function.preg match]:编译失败:偏移量处字符类中的范围顺序错误243@nmford:您添加分隔符了吗?脚本现在可以解析了,但它仍然与我笔记本电脑上的firefox匹配,这是不应该的。我开始想也许我应该自己把一些更简单的东西放在一起@nmford:匹配Firefox是因为Mozilla的
。。。你应该使用原子组。或者更好的是,不要重新发明轮子:。@AlixAxel我已经更新了演示。现在运行良好。我注意到您的答案中的原始剪切/粘贴正则表达式遗漏了一些元字符。