Php 使用preg_match解析表达式
我试图使用preg_match解析以下内容:Php 使用preg_match解析表达式,php,regex,preg-match,match,Php,Regex,Preg Match,Match,我试图使用preg_match解析以下内容: 2020|9 digits number|date hour|word|word 例如: 2020|123456789|01/04/2011 09:09:37|Basketball|sms 我正在做: $regex = '2020|/[0-9]+\|[a-zA-Z]+\|[0-9]{2}\/[0-9]{2}\/[0-9]{4}.*/'; return !(preg_match($regex,$value)); 但我得到的错误是分隔符不能是字母
2020|9 digits number|date hour|word|word
例如:
2020|123456789|01/04/2011 09:09:37|Basketball|sms
我正在做:
$regex = '2020|/[0-9]+\|[a-zA-Z]+\|[0-9]{2}\/[0-9]{2}\/[0-9]{4}.*/';
return !(preg_match($regex,$value));
但我得到的错误是分隔符不能是字母数字或反斜杠,而且我甚至没有接近它
你能帮我一个忙吗?如果
是你的分隔符,并且数据总是按照你描述的方式构造的,为什么不使用explode()
$array = explode ("|", $value);
echo $array[0]; // Will output "2020"
echo $array[1]; // Will output "123456789"
要使其可靠工作,任何列都不能包含“|”作为内容字符。但你也会受到正则表达式的限制
如果您要解析像这样构建的整个文件,请看一看。如果
是分隔符,并且数据总是按照您描述的方式构造,为什么不使用explode()
$array = explode ("|", $value);
echo $array[0]; // Will output "2020"
echo $array[1]; // Will output "123456789"
要使其可靠工作,任何列都不能包含“|”作为内容字符。但你也会受到正则表达式的限制
如果您正在解析这样构建的整个文件,请查看。您的正则表达式有一些问题
- 转义第一个
|
- 将第一个
移动到正则表达式的开头。/
是一个分隔符,用于标记正则表达式的开始和结束/
- 删除
,因为它与您没有定义的单词相匹配[a-zA-Z]+
$regex = '/2020\|[0-9]+\|[0-9]{2}\/[0-9]{2}\/[0-9]{4}.*/';
return !(preg_match($regex,$value));
您还可以使用
作为分隔符,以避免转义文本/
s
$regex = '#2020\|[0-9]+\|[0-9]{2}/[0-9]{2}/[0-9]{4}.*#';
它也不像您对字符串的定义那样严格。我建议作出以下改进:
- 使用
精确匹配9位数字,而不是1+[0-9]{9}
- 将时间戳与
匹配[0-9]{2}:[0-9]{2}:[0-9]{2}
- 将最后两个单词与
匹配\w+\\124;\ w+
- 添加
和^
锚定以强制匹配完整字符串$
$regex = '#^2020\|[0-9]{9}\|[0-9]{2}/[0-9]{2}/[0-9]{4}\s[0-9]{2}:[0-9]{2}:[0-9]{2}\|\w+\|\w+$#';
查看它。您的正则表达式有一些问题
- 转义第一个
|
- 将第一个
移动到正则表达式的开头。/
是一个分隔符,用于标记正则表达式的开始和结束/
- 删除
,因为它与您没有定义的单词相匹配[a-zA-Z]+
$regex = '/2020\|[0-9]+\|[0-9]{2}\/[0-9]{2}\/[0-9]{4}.*/';
return !(preg_match($regex,$value));
您还可以使用
作为分隔符,以避免转义文本/
s
$regex = '#2020\|[0-9]+\|[0-9]{2}/[0-9]{2}/[0-9]{4}.*#';
它也不像您对字符串的定义那样严格。我建议作出以下改进:
- 使用
精确匹配9位数字,而不是1+[0-9]{9}
- 将时间戳与
匹配[0-9]{2}:[0-9]{2}:[0-9]{2}
- 将最后两个单词与
匹配\w+\\124;\ w+
- 添加
和^
锚定以强制匹配完整字符串$
$regex = '#^2020\|[0-9]{9}\|[0-9]{2}/[0-9]{2}/[0-9]{4}\s[0-9]{2}:[0-9]{2}:[0-9]{2}\|\w+\|\w+$#';
请参阅。与Perl兼容的正则表达式必须以分隔符开头和结尾(下面,
%
)。RE以“2”开头,PCRE将其解释为分隔符,因此“分隔符不能是字母数字或反斜杠”错误
我用以检查“2020 | 9位数字|日期小时|单词|单词”的表达式是%^2020\{9}\\d{2}[-/]\d{2}[-/]\d{4}\d{2}:\d{2}:\d{2}\w+$%
。除了日期之外,与字段匹配的REs非常简单:预定义的类(\d
表示数字,相当于[0-9]
;\w
表示单词,相当于[a-Za-z0-9]
)和重复({n}
表示正n,+/code>表示1或更多)
日期由\d{2}[-/]\d{2}[-/]\d{4}\d{2}:\d{2}:\d{2}
匹配。它使用与其他子模式相同的元素,只是有更多的元素。如果要匹配更多的日期格式,则需要编写更复杂的RE,或者提取日期并使用(例如,strotime
解析它
如果您希望解析整个字符串,而不是简单地检查它,请遵循Pekka的建议。与Perl兼容的正则表达式必须以分隔符开头和结尾(下面,%
)。RE以“2”开头,PCRE将其解释为分隔符,因此“分隔符不能是字母数字或反斜杠”错误
我用以检查“2020 | 9位数字|日期小时|单词|单词”的表达式是%^2020\{9}\\d{2}[-/]\d{2}[-/]\d{4}\d{2}:\d{2}:\d{2}\w+$%
。除了日期之外,与字段匹配的REs非常简单:预定义的类(\d
表示数字,相当于[0-9]
;\w
表示单词,相当于[a-Za-z0-9]
)和重复({n}
表示正n,+/code>表示1或更多)
日期由\d{2}[-/]\d{2}[-/]\d{4}\d{2}:\d{2}:\d{2}
匹配。它使用与其他子模式相同的元素,只是有更多的元素。如果要匹配更多的日期格式,则需要编写更复杂的RE,或者提取日期并使用(例如,strotime
解析它
如果您希望解析整个字符串,而不是简单地检查它,请遵循Pekka的建议。是的,我认为是这样,错误是:“分隔符不能是字母数字或反斜杠”。但是我做不到,我不能逃避,你能帮我吗?谢谢马可,我要把文件的所有行都拿回来。。但是它应该只显示错误,不等于表达式的行。。这是疏远。@user你必须给出一个例子。我们猜不出哪里出了问题。如果$regex='\^2020\\\[0-9]{9}\\[a-zA-Z]+\\[0-9]{2}/[0-9]{2}/[0-9]{4}[0-9]{2}:[0-9]{2}:[0-9]{2}:[0-9]{2}:[0-9]{2}:[0-9]{2}.\w+$';匹配此结构2020 | 123456789 | 01/04/2011 09:09:37 | Basketball | sms为什么返回!(preg_match($regex,$value));正在返回文件中的所有行吗?它们中的大多数都是像示例一样构建的,这应该会返回