Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式可选匹配,无贪婪性_Php_Regex_Preg Match - Fatal编程技术网

Php 正则表达式可选匹配,无贪婪性

Php 正则表达式可选匹配,无贪婪性,php,regex,preg-match,Php,Regex,Preg Match,出于教育目的,我正在尝试匹配以下内容的姓名、电话和电子邮件: John +1 288298600 john@site.com Billy Mike +1 768397651 mike@site.com Patrick +2 938468172 Jack jack@site.com 我知道如何从中获取所有电子邮件和电话,但我想在这里做的是不同的 我想为每个名字(约翰、比利、迈克、帕特里克、杰克)获取他们的电话(如果有)和电子邮件(如果有)。所以比赛是这样的 'John', '+1

出于教育目的,我正在尝试匹配以下内容的姓名、电话和电子邮件:

John
+1 288298600
john@site.com

Billy

Mike
+1 768397651
mike@site.com

Patrick
+2 938468172

Jack
jack@site.com
我知道如何从中获取所有电子邮件和电话,但我想在这里做的是不同的

我想为每个名字(约翰、比利、迈克、帕特里克、杰克)获取他们的电话(如果有)和电子邮件(如果有)。所以比赛是这样的

'John',    '+1 288298600',  'john@site.com'
'Billy',   '',             ''
'Mike',    '+1 768397651', 'mike@site.com'
'Patrick', '+2 93868172',  ''
'Jack',    '',             'jack@site.com'
请注意,如果没有相应的信息(电话或电子邮件),它将匹配一个空字符串。我该怎么做

我的尝试:
([A-Za-z0-9]+)(?:。(\+.?)|?(:。(


有人能给我指引正确的方向吗?

不要尝试使用多个匹配项来完成此操作,它不会带你去任何地方。相反,每个条目匹配一次,并使用捕获组提取相关数据

下面是一个示例(带有
mx
标志):

^(?[\p{L}\h]+$)\R
(?:(?^\+[\d\h]+$)\R)?
(?^.+?@.+?\..+)?

第一行与名称匹配,后面是换行符。第二行是可选的-它匹配一个电话号码,后跟一个新行。第三行也是可选的,与邮件匹配


如果需要,您可以细化子模式,我只是选择了一些似乎与您的输入数据相关的子模式。

不要尝试使用多个匹配项来完成此操作,它不会将您带到任何地方。相反,每个条目匹配一次,并使用捕获组提取相关数据

下面是一个示例(带有
mx
标志):

^(?[\p{L}\h]+$)\R
(?:(?^\+[\d\h]+$)\R)?
(?^.+?@.+?\..+)?

第一行与名称匹配,后面是换行符。第二行是可选的-它匹配一个电话号码,后跟一个新行。第三行也是可选的,与邮件匹配


如果需要,您可以细化子模式,我只是选择了一些似乎与您的输入数据相关的子模式。

显示您的尝试使用我的尝试显示您的尝试使用我的尝试如何知道电话/邮件是否属于特定名称?假设电话/邮件是可选的,这意味着其匹配项可能少于(必需的)名称。谢谢(附言:你的意思是我应该运行preg_match 3次吗?)。这是一个单一的正则表达式。您可以这样写在一行中:
^(?[\p{L}\h]+$)\R(?(?^\+[\d\h]+$)\R)?(?^.+?@.+?\.+..+)
,但可读性较差。所以每场比赛都会给你带来1到3条信息。与
preg\u match\u all
一起使用。非常感谢。如果没有任何修改器,您将如何解决此问题?我试图把它移植到C++(Tr1正则表达式)中。呃,哦,你应该说,首先,作为代码> STD::ReGEX < /C>比PCRE严重受限。如果可以的话,我宁愿推荐
boost::regex
(甚至是PCRE本身,但它有一个C API)。因此,将所有内容放在一行中,将第一个
^
替换为
(?:^\r?\n)
,从模式中删除所有其他
^
$
,并将所有
\r
替换为
\r?\n
。这应该适用于
std::regex
,但实际上,如果可以,请使用更好的名称。我如何知道电话/邮件是否属于特定名称?假设电话/邮件是可选的,这意味着其匹配项可能少于(必需的)名称。谢谢(附言:你的意思是我应该运行preg_match 3次吗?)。这是一个单一的正则表达式。您可以这样写在一行中:
^(?[\p{L}\h]+$)\R(?(?^\+[\d\h]+$)\R)?(?^.+?@.+?\.+..+)
,但可读性较差。所以每场比赛都会给你带来1到3条信息。与
preg\u match\u all
一起使用。非常感谢。如果没有任何修改器,您将如何解决此问题?我试图把它移植到C++(Tr1正则表达式)中。呃,哦,你应该说,首先,作为代码> STD::ReGEX < /C>比PCRE严重受限。如果可以的话,我宁愿推荐
boost::regex
(甚至是PCRE本身,但它有一个C API)。因此,将所有内容放在一行中,将第一个
^
替换为
(?:^\r?\n)
,从模式中删除所有其他
^
$
,并将所有
\r
替换为
\r?\n
。这应该适用于
std::regex
,但实际上,如果可以,请使用更好的工具。
^(?<name>[\p{L}\h]+$)\R
(?:(?<phone>^\+[\d\h]+$)\R)?
(?<mail>^.+?@.+?\..+)?