Php 预赛基本问题

Php 预赛基本问题,php,regex,Php,Regex,我的预赛遇到了一些麻烦。 密码 $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); 我在$match[2]中得到了这个结果 "012 213 123. mobil: 023 123 123" 第一个问题。 我想让正则

我的预赛遇到了一些麻烦。 密码

$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);
我在$match[2]中得到了这个结果

"012 213 123. mobil: 023 123 123"
第一个问题。 我想让正则表达式停在点上,但它没有发送。 有人能解释一下为什么不是这样吗

第二个问题。 preg_match使用()获得匹配项。 是否可以跳过围绕不同“Tel”的括号,仍然获得相同的功能

Thnx所有stackoverflow都很好:这应该可以:

/tel(?:\s|:)+([^.]+)(?:\.|$)/i
+
是一个贪婪的量词,这意味着它将匹配尽可能多的字符

关于第二个问题:在这种情况下,您只需要使用不区分大小写的匹配(
i
flag)。通常,您可以使用
(?:…)
语法,您可以在结尾匹配中看到该语法的示例。方括号用于字符类。

这应该可以:

/tel(?:\s|:)+([^.]+)(?:\.|$)/i
+
是一个贪婪的量词,这意味着它将匹配尽可能多的字符


关于第二个问题:在这种情况下,您只需要使用不区分大小写的匹配(
i
flag)。通常,您可以使用
(?:…)
语法,您可以在结尾匹配中看到该语法的示例。方括号用于字符类。

如果您只是试图从该行中提取一个电话号码,并且该号码保证为11个号码,您可以简单地使用以下方法:

$text = 'tel: 012 213 123. mobil: 0303 11234';
$phone_number = substr(preg_replace('/[^\d]/', '', $text), 0, 11);`
在您的示例中,
$phone\u number
将是
0122131230


其工作原理是将任何非数字替换为空字符串,将其删除,然后返回前11个号码。

如果您只是想从该行中提取一个电话号码,并且保证是11个号码,您可以简单地使用以下方法:

$text = 'tel: 012 213 123. mobil: 0303 11234';
$phone_number = substr(preg_replace('/[^\d]/', '', $text), 0, 11);`
在您的示例中,
$phone\u number
将是
0122131230


它的工作原理是:将任何非数字替换为空字符串,将其删除,然后返回前11个数字。

不知道-您的正则表达式对我有效(我在
$match[2]
中得到“012 213 123”与您的代码匹配)。事实上,手机在两者之间的差异可能表明它并不是真正的代码输出;再查一遍

其他一些事情-如果你恰好在一行中有更多的点(“例如电话:xxx.电话:xxx.传真:xxx”),你会得到不好的结果-使用非贪婪运算符(“获取匹配的最小块”
*?
,而不是“获取匹配的最大块”
*
),或者限制重复字符(“任意数量的非句点”
[^。]*
)。另外,您可以通过使regex不区分大小写来省去麻烦(除非您真的讨厌人们键入“tEl”)

您的另一个问题:
(?:stuff)
将匹配“stuff”,就像
(stuff)
一样,但不会捕获它


有用的链接:

不知道-你的正则表达式对我有用(我在
$match[2]
中得到了“012213 123”和你的代码)。事实上,手机在两者之间的差异可能表明它并不是真正的代码输出;再查一遍

其他一些事情-如果你恰好在一行中有更多的点(“例如电话:xxx.电话:xxx.传真:xxx”),你会得到不好的结果-使用非贪婪运算符(“获取匹配的最小块”
*?
,而不是“获取匹配的最大块”
*
),或者限制重复字符(“任意数量的非句点”
[^。]*
)。另外,您可以通过使regex不区分大小写来省去麻烦(除非您真的讨厌人们键入“tEl”)

您的另一个问题:
(?:stuff)
将匹配“stuff”,就像
(stuff)
一样,但不会捕获它


有用的链接:

为什么角色类中有管道
[\.\124;\ n]
[\s\124;::]
?字符类(方括号中的内容
[]
)根据定义类似于OR关系,因此您不需要管道。。。除非你真的想匹配管道
|

至于问题1,我不确定你的问题出在哪里,但通常这与贪婪的量词有关。
(.+)
量词是贪婪的,因此它在匹配整个模式的同时尽可能多地匹配。贪婪的量词不关心模式中它们后面的内容。由于句点
匹配除新行字符以外的任何字符,因此它可以匹配句点,因此它确实匹配句点。要使量词不贪婪,可以使用问号

对于正则表达式中的第二个问题,使用括号对内容进行分组和存储。如果您想将
(tel | tel | tel)
分组,但不将其存储在
$match
中,您可以在左括号后添加
?:

(?:tel|Tel|TEL)

为什么角色类中有管道
[\.\124;\ n]
[\s\124;::]
?字符类(方括号中的内容
[]
)根据定义类似于OR关系,因此您不需要管道。。。除非你真的想匹配管道
|

至于问题1,我不确定你的问题出在哪里,但通常这与贪婪的量词有关。
(.+)
量词是贪婪的,因此它在匹配整个模式的同时尽可能多地匹配。贪婪的量词不关心模式中它们后面的内容。由于句点
匹配除新行字符以外的任何字符,因此它可以匹配句点,因此它确实匹配句点。要使量词不贪婪,可以使用问号

对于正则表达式中的第二个问题,使用括号对内容进行分组和存储。如果您想将
(tel | tel | tel)
分组,但不将其存储在
$match
中,您可以在左括号后添加
?:

(?:tel|Tel|TEL)

你的意思是你只想匹配号码,这样你就不必去掉电话:和点?试试这个:

/tel[:\s]+\K[^.]+/i
i
使其不区分大小写