2011-05-29 75 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