2011-05-29 30 views
-1

我試圖在inch12" wall將成爲12 inch wall正則表達式模式的差異 - 「*」 和 「+」

更換"我有2種模式工作:

/\b([0-9]+)"/ -> preg_replace('/\b([0-9]+)"/', '$1 inch ', $string) 

/\b([0-9]*)"/ -> preg_replace('/\b([0-9]*)"/', '$1 inch ', $string) 

他們之間有什麼區別呢,爲什麼+*在這裏以相同的方式工作?

歡呼聲, /馬爾欽

+0

您知道「*」和「+」是什麼意思嗎? – 2011-05-29 09:46:34

+0

http://www.php.net/manual/en/regexp.reference.repetition.php – hakre 2012-10-29 12:30:13

回答

1

+表示查找前一個字符/組1次或多次。

*表示查找前一個字符/組的任意次數(0-infinity)

+0

在上面的例子中,它們似乎執行完全相同的功能,並且找不到區別 – Marcin 2011-05-29 09:51:32

+1

如果沒有號碼或號碼(如果有號碼和報價,如果有號碼或報價都匹配,或者報價前沒有任何內容會返回任何匹配),它們將表現相同。然而,如果前面有一個字母/單詞,那麼帶*的那個將匹配該引用,而帶有+的那個不會。 ''([0-9] *)''''在'新棕色'牆上與'''相匹配 - 但 '([0-9] +)\「'與'新棕色'牆中沒有任何匹配' – SmokeyPHP 2011-05-29 10:02:36

+1

If '12「'是你的測試用例中唯一可能的匹配,那麼兩者的表現確實相同。 – Arjan 2011-05-29 10:03:56

1

/\b([0-9]+)"/要求有字邊界和"之間的至少一個位,而/\b([0-9]*)"/還接受零位。所以第一個不匹配空格,然後是",第二個是。

如果你想馬赫都new 15 " tvnew 15" tv你需要來匹配空格字符,可能會或可能不存在:

/\b([0-9]+)\s?"/ 

這一個字邊界匹配,其次是序號(或更多)號碼,可選後跟一個空格(或製表符),然後是"。我想這就是你要找的。 如果不是,您應該先定義必須匹配的字符串和可能不匹配的字符串。

+0

沒有一個,即'新的15「電視'不會被任何這些模式 – Marcin 2011-05-29 09:49:34

+0

取代也許我誤解了' b',但如果你想匹配'新的15「電視和'新的15」電視''你不需要字界限,我會更新我的答案。 – Arjan 2011-05-29 09:55:44

+1

'15「'不會匹配,因爲你不是'不允許空格,我會建議'([0-9] +)\ s?\「' - 注意'\ s?',這意味着可選空間 – SmokeyPHP 2011-05-29 09:56:04