Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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 使用preg_match解析表达式_Php_Regex_Preg Match_Match - Fatal编程技术网

Php 使用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)); 但我得到的错误是分隔符不能是字母

我试图使用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));
但我得到的错误是分隔符不能是字母数字或反斜杠,而且我甚至没有接近它


你能帮我一个忙吗?

如果
是你的分隔符,并且数据总是按照你描述的方式构造的,为什么不使用
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}.*#';
它也不像您对字符串的定义那样严格。我建议作出以下改进:

  • 使用
    [0-9]{9}
    精确匹配9位数字,而不是1+
  • 将时间戳与
    [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}.*#';
它也不像您对字符串的定义那样严格。我建议作出以下改进:

  • 使用
    [0-9]{9}
    精确匹配9位数字,而不是1+
  • 将时间戳与
    [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));正在返回文件中的所有行吗?它们中的大多数都是像示例一样构建的,这应该会返回