2010-05-19 56 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