2010-05-19 128 views
0

我的preg_match遇到了一些麻煩。 代碼。preg_match基本知識問題

$text = "tel: 012 213 123. mobil: 0303 11234 \n address: street 14"; 
$regex_string = '/(tel|Tel|TEL)[\s|:]+(.+)[\.|\n]/'; 

preg_match($regex_string , $text, $match); 

我得到這樣的結果在$比賽[2]

"012 213 123. mobil: 023 123 123" 

第一個問題。 我想要正則表達式停在。(點),但它沒有。 有人可以解釋爲什麼它不是?

第二個問題。 preg_match使用()來獲得它們的匹配。 是否可以跳過圍繞不同「Tel」的括號並仍然獲得相同的功能?

日Thnx所有計算器是偉大的:d

+0

你確定'@match [2]'實際上不是'「012 213 123. mobil:0303 11234」'? – 2010-05-19 14:23:02

+0

哦,即時通訊對不起,我添加了一些文字,當我將其從上下文中撕掉時錯過了。 – 2010-05-19 14:38:26

回答

1

這應該這樣做:

/tel(?:\s|:)+([^.]+)(?:\.|$)/i 

+是一個貪婪的量詞,這意味着它會匹配儘可能多的字符可能。

第二個問題:在這種特殊情況下,您只需要使用不區分大小寫的匹配(i標誌)。通常,您可以使用(?:...)語法,在最終匹配中可以看到它的示例。方括號用於字符類。

+0

如果這是一個貪婪的量詞問題,那麼'[\。| \ n]'匹配了什麼? – 2010-05-19 14:29:03

+0

好的...不知道(?:...)語法...非常有幫助thnx。 我猜我還沒有真正掌握角色類。 – 2010-05-19 14:29:42

+0

@Richard:行尾字符? – SilentGhost 2010-05-19 14:30:09

1

如果你只是想提取電話號碼跳出那行,它的保證是11個數字,你可以簡單地使用:

$text = 'tel: 012 213 123. mobil: 0303 11234'; 
$phone_number = substr(preg_replace('/[^\d]/', '', $text), 0, 11);` 

你的榜樣,$phone_number0122131230

這是如何工作的任何非數字被替換爲空字符串,將其刪除,然後返回前11個數字。

+0

很有幫助,但它不會是一個靜態數字的數字。 – 2010-05-19 14:35:22

+0

@ Yo-L:那麼它會是相同的格式,但只是數量不等?例如,沒有區號的電話號碼? – ryeguy 2010-05-19 14:50:43

1

不知道 - 你的正則表達式對我有用(我用你的代碼在$match[2]處得到「012 213 123」)。兩者之間的手機差異的事實可能表明,它不是你的代碼的輸出;再檢查一遍。如果你碰巧在線上有更多的點(例如,「tel:xxx。phone:xxx。fax:xxx」),你將得到不好的結果 - 使用非貪婪的操作符(「get (.*?而不是「獲得匹配的最大塊」.*)或限制重複字符(「任意數量的非期間」[^.]*)。另外,通過使正則表達式不區分大小寫(除非你真的討厭輸入「tEl」的人),你可以省去麻煩。

您的其他問題:(?:stuff)將匹配「stuff」,就像(stuff)一樣,但不會捕獲它。

有用的鏈接:http://www.regular-expressions.info/

+0

我知道它錯誤發佈的問題,但Silentghost正確無論如何:S 得到了另一個頁面的頁面:)仍然很難掌握。 – 2010-05-19 14:32:35

1

爲什麼你有你的角色等級[\.|\n][\s|:]管?字符類(方括號[]中的東西)根據定義像是OR關係,所以你不需要管道......除非你真的試圖匹配管道|

至於問題#1,我不確定是什麼引起了你的問題,但通常這與貪婪的量詞有關。量詞是貪婪的,因此儘量匹配整個模式。貪婪的量詞不關心模式中的後面。由於句點.與新行字符以外的任何字符匹配,因此它可以匹配句點,因此它與句點匹配。要使量詞非貪婪,可以使用問號?

對於第二個問題在RegEx中使用括號來分組並存儲它們。如果你想組(tel|Tel|TEL)但不要將其存放在$match可以開括號後放一個?:在:

(?:tel|Tel|TEL) 
+0

是的,我把管子搞亂了。 – 2010-05-19 14:41:38

1

你的意思是你想匹配數量,因此你不必剝離tel:和點?試試這個:

/tel[:\s]+\K[^.]+/i 

i使得它不區分大小寫。

[:\s]符合冒號或空格(|不等於「或」在字符類中,它只是匹配|)。

[^.]+匹配一個或多個非點;當它看到一個點或行的末尾時會停止匹配,因此如果不想在結果中使用點,則不必匹配點。

最後,\K的意思是「忘記你到目前爲止匹配的任何東西,並假裝匹配真的從這裏開始」 - 一個功能的小寶石,只有Perl和PHP(我知道)。

+0

這就是很好的信息.. ty男人從來沒有聽說過\ K – 2010-05-19 14:34:43