PHP正则表达式:Unknown modifier

Posted by

头一次遇见使用正则时出现这种报错:Warning: preg_match(): Unknown modifier ‘/’ in ****,其中pattern为:

/^(#|//|https?://|mailto:|tel:)/

在看Laravel源码时,里面有关于URL的这么一段代码:

if (! preg_match('~^(#|//|https?://|mailto:|tel:)~', $path)) {
	return filter_var($path, FILTER_VALIDATE_URL) !== false;
}

这里正则表达式里“~”第一次遇见有这么写,还以为“~”是特殊的元字符,有特定的含义,并且之前都碰到的正则表达式开头和结尾是“/”。于是尝试替换成常见的 “/” ,本地运行之后,报错了Warning: preg_match(): Unknown modifier ‘/’ in ****。

后面了解到,原来是因为定界符与正则表达式里的内容冲突了,因为里面刚好包含字符“/”。所以这里原文的“~”实际也是定界符,关于PHP正则定界符要求:定界符,不能用a-zA-Z0-9\ 其他的都可以用。必须成对出现,有开始就有结束。

所以,这里如果要用到“/”来作为定界符,那么正则表达式的内容就需要调整为:

/^(#|\/\/|https?:\/\/|mailto:|tel:)/

这样,就没有问题了。

Leave a Reply

邮箱地址不会被公开。 必填项已用*标注