Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.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正则表达式有助于使用浏览器代理字符串_Php_Regex_Preg Match - Fatal编程技术网

PHP正则表达式有助于使用浏览器代理字符串

PHP正则表达式有助于使用浏览器代理字符串,php,regex,preg-match,Php,Regex,Preg Match,我目前正试图通过一些简单的“真实世界”示例来学习正则表达式 考虑以下字符串: Mozilla/5.0(Windows;U;Windows NT 5.0;en-US;rv:1.9.2A1前)壁虎 我想找到RV值(1.9.2a1pre)。我需要应用以下规则: RV:在任何情况下都可以(RV,RV,RV,RV…) RV:可以在字符串中的任何位置 RV:值以右括号、任何空格(包括换行符)、分号或字符串结尾 到目前为止,我做到了: /rv:[.][\)]?/i 但它不起作用(我必须远离“真正的”解决方案

我目前正试图通过一些简单的“真实世界”示例来学习正则表达式

考虑以下字符串:

Mozilla/5.0(Windows;U;Windows NT 5.0;en-US;rv:1.9.2A1前)壁虎

我想找到RV值(1.9.2a1pre)。我需要应用以下规则:

  • RV:在任何情况下都可以(RV,RV,RV,RV…)
  • RV:可以在字符串中的任何位置
  • RV:值以右括号、任何空格(包括换行符)、分号或字符串结尾
  • 到目前为止,我做到了:

    /rv:[.][\)]?/i
    
    但它不起作用(我必须远离“真正的”解决方案)


    表达式必须与PHP一起使用。

    我认为
    [.]
    表示一个点,而不是“任何字符”。。。 改用这个:

    /rv:.+[\)]?/i
    

    这是我的修订版,允许RV子串位于任何位置

    /rv:[\s]*([^); ]+)/i
    
    • ()
      表示捕获组(即,您希望从此过程中获取的内容)
    • [^);]
      表示不是
      *空格*
      的字符
    • +
      表示一次或多次
    • *
      表示您想要多少就多少,0-many
    • [\s]*
      在括号之前基本上意味着我们从匹配项中切掉任何前导空格,这在本例中非常重要,因为我们明确地说我们在空格上打断了主匹配项
    因此,这是为了捕获字符串,不包括
    长度上的一个或多个字符,紧跟在
    rv:
    之后

    您的版本
    /rv:[.][\)]?/i
    查找单个
    ,然后选择一个

    将匹配
    rv
    ,后跟一个
    (可能被空格包围),然后是除
    以外的一系列字符
    和空格(包括换行符)。匹配结果(在
    rv:
    之后)将被捕获到backreference no.1中。

    试试这个

    $str = 'Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.2a1pre) Gecko';
    preg_match('/rv:([^\)]*)/i', $str , $matches);
    echo $matches[1];
    
    可能是:

    /rv:([^); \n]+)/i
    

    这意味着没有);空间线馈送一个或多个不区分大小写并捕获的时间

    我想您需要的是:

    (?<=rv:).*(?=\))
    

    (?
    /rv:([^)]+)/i
    -需要阅读的术语:字符类、量词、捕获组/子模式。您可能希望在方括号中包含空格。@Frank,这是对OP的轻推,不是答案,因此是评论,而不是发布的真实答案⇩ 在下面。为了简洁起见,我省略了“这是一个起点”和任何真正的解释(并且作为一个持续的社会实验,看看下面的答案是否符合规范,或者只是复制和粘贴;在这一点上,我得到了很好的回报)。如果您采取其他方式,我向您道歉。我想您已经意识到:它似乎没有捕获RV值。它是相关的,所以我想我应该发布它。嗯。是的,我知道:)RV值只适用于(非常)早期的Mozilla浏览器。在大多数情况下似乎有效,但它是否考虑了RV:value的结尾(右括号、分号、尾端或空格)?顺便说一句,我不知道为什么有人否决了你:(你对原始正则表达式的描述不完全正确;它寻找的是一个单点字符。你修改后的正则表达式答案与项目符号描述不匹配。它现在正在处理我所有的测试用例(我有几百个)。Tim Pietzcker版本也可以/rv:([^;)\s]+)/I任何一个“更好”?@Activator:Tim的更准确地描述如下。Tim的在
    rv:
    之后不允许有任何空间。例如
    rv:1.9.2.5
    不匹配。我不知道这种可能性有多大,但你就这样做了。只是尝试了一下,它不起作用。除了rv:value的结尾,olione看起来还可以。它正在处理我所有的测试用例(我有几百个)。奥利版本也可以/rv:([^;)\s]+)/i任何一个“更好”?好的,这个版本也接受制表符和换行符来结束匹配,正如您指定的那样。除此之外,它们几乎完全相同。您的版本非常完美,但我如何将此规则添加到您的regexp:“:”(for“rv”)可以被引导并后跟可选空格(因此,在任何字符大小写中,匹配可以是“rv:”或“rv:”或“rv:”或“rv:”。好的,我现在明白了:)最后一个问题:您为什么不用[](像奥利)?我想这是多余的,但为什么呢?如果你想把几个不同的字符组合成一个逻辑单元,你需要括号。
    [abc]
    意味着“a、b或c中的一个”
    [a]
    a
    相同。有时单个字符类对于可读性来说是有意义的:
    ^[]*
    在某些人看来比
    ^*
    更好。只是在我的本地开发中尝试了相同的代码,结果是:1.9.2.a1pre,所以它应该可以正常工作-也许您的代码可以帮助我们帮助您?是的,但是rv:值也可以以a结尾;并且您的regexp在这些情况下不起作用(请参阅我问题中的第3点)。
    (?<=rv:).*(?=\))
    
    $str = 'Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.2a1pre) Gecko';
    preg_match('/rv:([a-z0-9\.])*/im', $str , $matches);
    echo $matches[1];