【问题标题】:iOS detection using regex in PHP在 PHP 中使用正则表达式进行 iOS 检测
【发布时间】:2012-10-12 14:36:11
【问题描述】:

我来到这里寻找通过用户代理嗅探 iOS 6 的答案,并在这里找到了一个很好的答案:How to detect iOS 6 and all minor versions by user agent?

我之前使用过的所有正则表达式都非常简单,我正在努力让这个正则表达式正常工作。不幸的是,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";
}

【问题讨论】:

  • var_dump( $_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 特别是因为该用户已将其作为正确答案进行检查

标签: php regex


【解决方案1】:

试试这个:

^(?:(?:(?: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+)?.*)?$

演示:http://gskinner.com/RegExr/?32eou

更通用的解决方案:http://code.google.com/p/php-mobile-detect/

【讨论】:

  • 警告:preg_match() [function.preg-match]:编译失败:偏移量 243 处的字符类范围乱序
  • @nmford:你添加了分隔符吗?
  • 脚本现在解析,但它仍然与我笔记本电脑上的 Firefox 匹配,这是不应该的。开始认为也许我应该自己把一些更简单的东西放在一起!
  • @nmford:匹配 Firefox,因为 Mozilla 并且因为其他所有内容都是可选的......您应该使用原子组。或者更好的是,不要重新发明轮子:code.google.com/p/php-mobile-detect
  • @AlixAxel 我已经更新了演示。现在运行良好。我注意到您答案中的原始剪切/粘贴正则表达式遗漏了一些元字符。
【解决方案2】:

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

这是更新后的问题的 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";
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多