PHP正则表达式有助于使用浏览器代理字符串
我目前正试图通过一些简单的“真实世界”示例来学习正则表达式 考虑以下字符串: Mozilla/5.0(Windows;U;Windows NT 5.0;en-US;rv:1.9.2A1前)壁虎 我想找到RV值(1.9.2a1pre)。我需要应用以下规则: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 但它不起作用(我必须远离“真正的”解决方案
/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];