用PHP编写正则表达式

用PHP编写正则表达式,php,regex,preg-match,preg-match-all,Php,Regex,Preg Match,Preg Match All,我有一个正则表达式模式,可以过滤掉一些特定的值 我尝试在PHP中运行该模式,但它总是为值返回NULL $re1='^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).*?"(.*?/p/.*?,\d+,(\d+).*?)" "(\d+)" "(\d+)".*$'; preg_match($re1, $current_line, $matches); var_dump($matches); 示例$current\u行变量值- 122.99.152.202 - na

我有一个正则表达式模式,可以过滤掉一些特定的值

我尝试在PHP中运行该模式,但它总是为值返回NULL

$re1='^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).*?"(.*?/p/.*?,\d+,(\d+).*?)" "(\d+)" "(\d+)".*$';


preg_match($re1, $current_line, $matches);


var_dump($matches);
示例$current\u行变量值-

122.99.152.202 - naveen [22/Nov/2013:13:24:40 +1300] "GET /p/bhYg_TohdFLAxXoNBgIEbg,1385079896,119118112/12.txt HTTP/1.1" "302" "160" "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36" "-" 

我哪里做错了?

您没有为正则表达式设置分隔符

分隔符可以是任何非字母数字、非反斜杠、非空白字符

除了
/
之外,还需要使用分隔符,这样可以避免在模式中转义
/
s:

$re1 = '~^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).*?"(.*?/p/.*?,\d+,(\d+).*?)" "(\d+)" "(\d+)".*$~';

如果你想的话,你可以把它压缩一点

$re1 = '~^((?:\d{1,3}\.?){4}).*?"(.*?/p/.*?,\d+,(\d+).*?)" "(\d+)" "(\d+)".*$~i';

php需要正则表达式的delimeters:Nginx使用与Apache兼容的格式format@mcuadros我有一个自定义的日志格式。@JonathanKuhn:我尝试用
\/p\/
替换
/p/
,但仍然返回空值。delimeter是第一个和最后一个字符,您所说的是转义。delimeter告诉php正则表达式的开始和结束位置。通常使用正斜杠(
/
),但实际上可以使用任何非单词字符(其他常用字符为
@
~
)。使用除
/
之外的delimeter的意义在于,您不需要转义正则表达式中的
/
。TLDR,您可以将类似于
@
的内容作为第一个和最后一个字符,它应该可以工作(我还没有测试其余部分是否工作)。