括号内的匹配模式

时间:2013-02-07 22:42:37

标签: php regex preg-match

我正在尝试创建一个移动检测类,它应该将用户代理剥离为一个简单的基本字符串,如下所示:

  

输出:   Mozilla / 5.0(* Linux x86_64 *)AppleWebKit / *(KHTML,如   Gecko)Chrome / * Safari / *

来自:

  

输入:(HTTP_USER_AGENT)   Mozilla / 5.0(X11; Linux x86_64)AppleWebKit / 537.17(KHTML,和Gecko一样)   Chrome / 24.0.1312.69 Safari / 537.17

我正在使用这个:/[0-9.-]{4,}/i模式来删除数字,我得到:

  

结果我上面的模式远远超过:   Mozilla / 5.0(X11; Linux x86_64)AppleWebKit / *(KHTML,和Gecko一样)   Chrome / * Safari / *

但我的问题是如何删除X11;我想要一个模式,它将删除第一个开始括号后的所有内容,直到第一个空白区域,我认为这是正确的方法。可接受的替代方案是能够用模式删除括号。

有什么建议吗?

PS:我需要这个解决移动检测的问题和对browscap的依赖。所以,请不要请誓言!

PS2:这主要是为了检测移动客户端和桌面。之后我会调整它以提供操作系统的信息等。

2 个答案:

答案 0 :(得分:1)

替换 X11; 但不是 KHTML

preg_replace('/\([^,)]*? ([^\)]+)/','(*\1*',$agent);

在此解释演示:http://regex101.com/r/vL6gT1

答案 1 :(得分:1)

尝试使用

preg_replace('/[0-9.-]{4,} #your original regex
    | # OR
    ( # start capture
       \( # open paren
    ) # end capture (so we can put the paren back)
    [^\s]+ # any number of non-space characters
    \d # a digit
    [^\s]+ # the remaining non-space characters (including other digits)
    \s # the final space
/xi', '\1', $str);