2010-06-30 46 views
2

我正在嘗試學習一些簡單的「真實世界」示例的正則表達式。PHP正則表達式幫助使用瀏覽器代理字符串

採取考慮以下字符串:

的Mozilla/5.0(窗口; U; Windows NT的 5.0; EN-US; RV:1.9.2a1pre)壁虎

我想找到RV值(1.9.2a1pre)。我需要應用以下規則:

  1. RV:可以在任何情況下(RV,RV,RV,旅行車...)。
  2. RV:可以在字符串中的任何位置。
  3. RV:值以右括號,任何空格(包括換行符),分號或字符串結尾結尾。

到目前爲止,我所做的:

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

,但它不工作(我一定要遠離「真實」的解決方案)......

表達式必須用PHP preg_match工作。

+0

'/ RV: - ([^)] +)/ i'條款上讀了起來:*字符類*,*量詞*,*捕獲組/子模式*。 – salathe 2010-06-30 18:45:02

+0

您可能想要在方括號中包含空格。 – Frank 2010-06-30 18:47:58

+0

@Frank,這是對OP的推not,不是一個回答,因此是一個評論,而不是一個真正的答案張貼在那裏。爲了簡潔起見,我忽略了「這裏有一個起點」和任何真正的解釋(並且作爲一個持續的社會實驗來看看下面的答案是不是完全滿足規範,或者只是複製和粘貼;請注意,我的回報很好)。如果你以其他方式採取了任何方式,請抱歉。 – salathe 2010-06-30 19:52:57

回答

2
/rv\s*:\s*([^;)\s]+)/i 

將匹配rv,接着:(其可以與空白所包圍),再一個低於;)和空白(包括新行)其他字符的運行。匹配結果(在rv:之後)將在反向引用編號中捕獲。 1.

+0

它與我所有的測試案例(我有幾百)。奧利版本炒作/ rv:([^;)\ s] +)/我任何一個「更好」? – Activist 2010-06-30 19:52:44

+0

那麼,這個版本也接受制表符和換行符來結束匹配,就像你指定的那樣。除此之外,它們幾乎完全相同。 – 2010-06-30 20:30:18

+0

你的版本是完美的,但我該如何將此規則添加到您的正則表達式中:「:」(對於「rv」)可以被引導並隨後是一個選項空間(因此匹配可以是「rv:」或「rv:」或「rv:」或「rv:」在任何字符的情況下 – Activist 2010-07-01 13:52:38

0

我覺得[.]意味着,沒有「任何字符」 ...... 用這個代替:

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

剛剛嘗試過,它不起作用。奧利似乎很好,除了rv:value的結尾。 – Activist 2010-06-30 19:10:06

1

這裏是我的修訂允許RV子字符串在任何地方

/rv:[\s]*([^); ]+)/i 
  • ()表示捕獲組(即,你想從這個過程中背什麼)
  • [^); ]意味着是)*space*;
  • +意味着一次或多次
  • *意味着,只要你喜歡,0一對多儘可能多的字符。
  • [\s]*就在括號之前,基本上意味着我們將任何領先的空白從比賽中截掉,在這種情況下必不可少,因爲我們明確地說我們打破了空間上的主要匹配。

所以這是尋找捕捉不包括在長度)一個或多個字符,rv:後立即字符的字符串。

您的版本/rv:[.][\)]?/i尋找單個.,然後選擇)

+0

似乎在大多數情況下工作,但它是否考慮到rv:value的結尾(右括號,分號,結束還是空白)? 順便說一句我不知道爲什麼有人低估了你:( – Activist 2010-06-30 19:09:15

+0

你對原始正則表達式的描述並不完全正確;它尋找一個**點**字符,你修正後的正則表達式的答案不符合項目符號的描述 – salathe 2010-06-30 19:47:27

+0

它現在正在處理我所有的測試案例(我有幾百個)。Tim Pietzcker版本也是如此/ rv:([^;)\ s] +)/我還有哪個「更好」? – Activist 2010-06-30 19:53:12

0

試...

$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]; 
+0

不工作,似乎類似Tim Pietzcker但沒有;趕上... – Activist 2010-06-30 19:50:42

+0

只是嘗試了在我的本地開發非常相同的代碼和輸出是: 1.9.2.a1pre 所以它應該工作正常 - 也許你的代碼更多可以幫助我們幫助你? – 2010-06-30 19:58:50

+0

是的,但rv:值也可以以a結尾;和你的正則表達式不工作在這些情況下(見我的問題中的點#3)。 – Activist 2010-06-30 20:04:00

0

可以是:

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

這意味着NO);空間換行一個或多個時間不區分大小寫並抓獲

0

我想你想要的是這樣的:

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

括號內的一切是一組。這個?<=被稱爲積極lookbehind。它基本上匹配你想要的字符串前面的一個字符串。這個?=被稱爲積極向前看,並匹配你想要的字符串後面的字符串。由於您想要的字符串只是數字,字母和一個小數或兩個,所以.運算符可以作爲一個查詢來匹配除換行符以外的任何字符。 *表示一個或多個以前的字符。

希望幫助

0
$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];