preg_match substring只有在有效的情况下才有效

时间:2014-08-07 10:34:43

标签: php preg-match substring extract

我需要从有效的电子邮件主题中提取子字符串。有效的子字符串如下:

ab-2011-0023adac-2011-0023ad.r1,只允许使用两个短划线,第二个短划线后的字母数会有所不同,但只有一个点或不带点的字母数字。

我写了这个,但是如果我在第二个破折号之后放一个非法字符,则regexp返回部分子字符串不为空

/([a-z0-9]{0,3}[-]\d{4}[-][a-z0-9.]+)\S/i

即:"this is an email with ab-2011-0023:ad document",我希望regexp返回空数组而不是[0] => ab-2011-0023

3 个答案:

答案 0 :(得分:1)

您的reg exp不正确。 1.永远不要在像[ - ]这样的符号类中使用一个文字。你应该逃避它 - 但是点头添加到符号类。 2. [a-z0-9。] +此作品与字符串“..............”匹配。所以,这不正确。 3.最后,您使用分隔符\ S(匹配除空格之外的所有内容)。

我的建议是使用这样的smth(如果你的reg exp引擎支持Negative Lookbehind)

/[a-z\d]{0,3}\-\d{4}\-(?:[a-z\d]+|(?<!\.)\.)+\s/i

example

答案 1 :(得分:0)

尝试转义(.匹配任何字符),并强制匹配完整字符串($启动结束,^表示开头):

/^[a-z0-9]{0,3}[\-]\d{4}[\-][a-z0-9\.]+$/i

示例:

$subject = "ac-2011-0023ad.r1";
$subject2 = "ab-2011-0023:ad";

if(preg_match("/^[a-z0-9]{0,3}[\-]\d{4}[\-][a-z0-9\.]+$/i",$subject,$match)) {
  echo "Found : ".$match[0]."\n";
}

if(preg_match("/^[a-z0-9]{0,3}[\-]\d{4}[\-][a-z0-9\.]+$/i",$subject2,$match)) {
  echo "Found : ".$match[0]."\n";
}

答案 2 :(得分:0)

只需在正则表达式周围添加空格:

/(?:\s|)([a-z0-9]{0,3}[-]\d{4}[-][a-z0-9]+(?:\.[a-z0-9]+)?)(?:\s|)/i