Php Regex-中的差异\\n和\n
很抱歉在互联网上添加另一个“Regex解释”问题,但我必须知道原因。我在没有帮助的情况下通过RegexBuddy和Regex101.com运行了这个正则表达式 在调试时间解析函数时,我遇到了以下正则表达式(Php Regex-中的差异\\n和\n,php,regex,datetime,syntax,scanf,Php,Regex,Datetime,Syntax,Scanf,很抱歉在互联网上添加另一个“Regex解释”问题,但我必须知道原因。我在没有帮助的情况下通过RegexBuddy和Regex101.com运行了这个正则表达式 在调试时间解析函数时,我遇到了以下正则表达式(%4d%[^\\n]“)。我偶尔会收到一个“无效日期”错误,但仅限于1月和6月。我模拟了一些代码来准确地再现正在发生的事情,但我不明白为什么删除一个斜杠可以修复它 <?php $format = '%Y/%b/%d'; $random_date_strings = array(
%4d%[^\\n]“
)。我偶尔会收到一个“无效日期”错误,但仅限于1月和6月。我模拟了一些代码来准确地再现正在发生的事情,但我不明白为什么删除一个斜杠可以修复它
<?php
$format = '%Y/%b/%d';
$random_date_strings = array(
'2015/Jan/03',
'1985/Feb/13',
'2001/Mar/25',
'1948/Apr/02',
'1948/May/19',
'2020/Jun/22',
'1867/Jul/09',
'1901/Aug/11',
'1945/Sep/21',
'2000/Oct/31',
'2009/Nov/24',
'2015/Dec/02'
);
$year = null;
$rest_of_string = null;
echo 'Bad Regex:';
echo '<br/><br/>';
foreach ($random_date_strings as $date_string) {
sscanf($date_string, "%4d%[^\\n]", $year, $rest_of_string);
print_data($date_string, $year, $rest_of_string);
}
echo 'Good Regex:';
echo '<br/><br/>';
foreach ($random_date_strings as $date_string) {
sscanf($date_string, "%4d%[^\n]", $year, $rest_of_string);
print_data($date_string, $year, $rest_of_string);
}
function print_data($d, $y, $r) {
echo 'Date string: ' . $d;
echo '<br/>';
echo 'Year: ' . $y;
echo '<br/>';
echo 'Rest of string: ' . $r;
echo '<br/>';
}
?>
可以在本地运行,但我只关心6月份和1月份的两个输出%4d%[^\\n]“
将$rest\u字符串
截断为/Ju
和/Ja
,%4d%[^\n]”
按预期显示字符串的其余部分(/Jan/03
&/Jun/22
)
以下是我对错误正则表达式的解释:
-获取四位数字%4d%
-查找字符串开头和新行之间的数字[^\\n]
我不关心如何…我需要原因。就像@lucastzesniewski指出的,这是语法,它与正则表达式无关。本页对格式进行了说明 在模式
%4d%[^\\n]“
中,两个\\
转换为一个反斜杠字符。因此,“错误”模式的正确解释是:
-获取四位数字%4d
-查找所有不是反斜杠或字母“n”的字符%[^\\n]
%4d%[^\n]“
,其中\n转换为新行字符,其解释为:
-获取四位数字%4d
-查找所有不是新行的字符%[^\n]
sscanf
语法,它与正则表达式无关:)@lucastrezesniewski我觉得很傻,但现在不那么疯狂了。我会找到一些sscanf格式的文档。就像上面@lucastzesniewski所说的,这种语法是针对sscanf的吗?或者这实际上是正则表达式?你是对的,这是sscanf()
语法。我已经更新了我的答案。