头一次遇见使用正则时出现这种报错: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:)/
这样,就没有问题了。