如何在php中使用长正则表达式字符串

如何在php中使用长正则表达式字符串,php,regex,regexbuddy,Php,Regex,Regexbuddy,我有一个regex字符串,我从一个网站上获取,用于从文件中提取电子邮件: (?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9

我有一个regex字符串,我从一个网站上获取,用于从文件中提取电子邮件:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
我在regex buddy(regex测试软件)中测试了它,它可以工作

当我将regex从regex buddy复制并粘贴到我的php文件时,我必须转义2个
字符,以使regex格式成为php中的有效字符串

在php中,我是这样使用它的:

$file = file_get_contents(/* URL TO GET */);

$email_pattern = "(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])";

$matches = array();

if ( preg_match_all ( $email_pattern, $file, $matches ))
{
    echo print_r($matches, true);
}
(?:[a-z0-9!#$%&\'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&\'*+/=?^_`{|}~-]+)*|\\\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\\\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])
但我得到了这个警告

Warning: preg_match_all() [function.preg-match-all]: Unknown modifier '@'
但是这个正则表达式在正则表达式buddy中工作

我哪里出了问题?

2件事:

步骤1:

您需要放置分隔符(regex前后的/以便添加修饰符):

步骤2:

在PHP字符串中,您需要转义所有特殊字符(例如\必须变成\,而$that将变成\$,等等)

因此,在PHP字符串中包含正则表达式的转义应该如下所示:

$file = file_get_contents(/* URL TO GET */);

$email_pattern = "(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])";

$matches = array();

if ( preg_match_all ( $email_pattern, $file, $matches ))
{
    echo print_r($matches, true);
}
(?:[a-z0-9!#$%&\'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&\'*+/=?^_`{|}~-]+)*|\\\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\\\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])
您还必须转义/,因为我们使用该字符作为第一步的分隔符。因此,我们需要正则表达式来查看\/,但当我们用php字符串表示正则表达式时,我们将替换/为\\/

如果我是对的——通常我也使用regex buddy来使用PHP导出工具进行转换,但现在我没有它,所以我是手工完成的——它应该会给出类似以下内容的

$email_pattern = '/(?:[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/';
我还建议您将字符串放在单引号内。

2件事:

步骤1:

您需要放置分隔符(regex前后的/以便添加修饰符):

步骤2:

在PHP字符串中,您需要转义所有特殊字符(例如\必须变成\,而$that将变成\$,等等)

因此,在PHP字符串中包含正则表达式的转义应该如下所示:

$file = file_get_contents(/* URL TO GET */);

$email_pattern = "(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])";

$matches = array();

if ( preg_match_all ( $email_pattern, $file, $matches ))
{
    echo print_r($matches, true);
}
(?:[a-z0-9!#$%&\'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&\'*+/=?^_`{|}~-]+)*|\\\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\\\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])
您还必须转义/,因为我们使用该字符作为第一步的分隔符。因此,我们需要正则表达式来查看\/,但当我们用php字符串表示正则表达式时,我们将替换/为\\/

如果我是对的——通常我也使用regex buddy来使用PHP导出工具进行转换,但现在我没有它,所以我是手工完成的——它应该会给出类似以下内容的

$email_pattern = '/(?:[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/';
我还建议您将字符串放在单引号内。

我尝试了

单引号将给出一个错误

使用双引号和{}作为分隔符//也会出现错误

我尝试过并

单引号将给出一个错误


使用双引号和{}作为分隔符//也会给出一个错误

我复制并粘贴了你的答案,得到了这个错误:警告:preg_match_all()[function.preg match all]:未知修饰符“=”。但是等号已经转义了?我也使用preg_quote自动转义regex特殊字符,但是我得到了错误:警告:preg_match_all()[function.preg match all]:未知修饰符“\”复制并粘贴了我在步骤1中的anwser,但是你是否如我在步骤2中提到的那样逃逸了?我现在尝试一下,to\beans\\and$beans\$但是还有什么我应该知道的吗?是否有在线列表或其他内容?@AlexMorley Finch:也逃逸斜杠
\//code>
'/(?:[a-z0-9-9的a-z0-9的a-z0-9的10-10 10 10 10 10 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5[a-z0-9-]*[a-z0-9])?\)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\[(?:(?:(?:25[0-5]| 2[0-4][0-9]|[01]?[0-9][0-9])\){3}(?:25[0-5]| 2[0-4][0-9]|[01]|[a-Z09](?)[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]\\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\]/'
是RegexBuddy为我想出的。你的反斜杠有点过火了!我复制并粘贴了你的答案,得到了这个错误:警告:preg\u match\u all()[function.preg match all]:未知修饰符“=”。但是等号已经转义了?我还使用preg_quote自动转义正则表达式特殊字符,但我得到了错误:警告:preg_match_all()[function.preg match all]:未知修饰符“\”复制并粘贴了我在第1步的anwser,但你是否如我在第2步中提到的那样逃逸了?我现在尝试一下,to\beans\\and$beans\$,但还有什么我应该知道的吗?是否有在线列表或其他内容?@AlexMorley Finch:也逃逸斜杠
\/
/(?:[a-z0-9!\$%&\'*+/=?)+(以下简称:::)除了除了除了除了一个a-z0-9-9-9-a-Z00-9现场现场现场现场现场现场现场现场的一个10-5 5 5 5 5 5 5 5除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外的其他以外的其他以外以外以外以外的其他以外的其他以外的其他以外以外以外以外以外以外的其他其他其他其他其他一些其他其他以外以外以外以外以外以外的其他一些其他以外以外以外以外的其他一些其他一些其他其他其他以外以外以外的其他一些其他其他其他其他其他其他其他其他其他其他其他一些其他以外以外,除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了[a-z0-9]?\[(?:(?:25[0-5]| 2[0-4][0-9]|[01]?[0-9][0-9]?)\){3}(?:25[0-5]| 2[0-4][0-9][01]?[0-9][0-9]?;[a-z0 9-*[a-z0 9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/“
是RegexBuddy给我的建议。你的反斜杠有点过火了!如果在regex中转义thoses,/delimiter将不会出错。现在甚至$都是因为双引号而被解释的。使用单引号,几乎只有\和'需要转义。你的权利!PHP将我很好,但不是电子邮件检查的regexp你必须为php转义,然后为regex转义,因此在某些情况下,你可能会有四个反斜杠,但双引号只是使问题更难解决。单引号可以工作,并且/分隔符不会给出错误,如果你在regex中转义thoses。现在甚至$都是因为dou而被解释的ble quote。对于单引号,几乎只有\和'需要转义。您的权利!PHP可以,但不是电子邮件检查的regexp。您必须转义为PHP,然后转义为regex,因此在某些情况下可能会有四个反斜杠,但双引号只会使问题更难解决。