我尝试将“eregi”表达式直接转换为“preg_match”表达式。
$ACCEPT_CHARS = "a-z0-9_~#&;=./?+-";
$msg = preg_match("/ (http|https|ftp|gopher|news)://([$ACCEPT_CHARS]+)/i", "<a href=\"\\1://\\2\" target=\"_blank\">\\1://\\2</a>", $msg);
但是,我得到了:
Warning: preg_match() [function.preg-match]: Unknown modifier '&' in /var/www/comm.borealisbbi.org/includes/functions_parse.php on line 282
我做错了什么?
原来的一行是:
$msg = eregi(" (http|https|ftp|gopher|news)://([$ACCEPT_CHARS]+)", "<a href=\"\\1://\\2\" target=\"_blank\">\\1://\\2</a>", $msg);
答案 0 :(得分:2)
这是因为正则表达式/
中的正斜杠。由于您将它们用作分隔符,因此正则表达式引擎期望表达式在/
之后结束。您可以将其转义,或使用其他分隔符:
$msg = preg_replace("~ (http|https|ftp|gopher|news)://([$ACCEPT_CHARS]+)~i", "<a href=\"\\1://\\2\" target=\"_blank\">\\1://\\2</a>", $msg);
那说......
我不明白为什么你在这里使用preg_match()
。我想你的意思是preg_replace()
?
你的正则表达式不是很强大。如果您要验证网址,则可以改为使用filter_var()
:
filter_var('example.com', FILTER_VALIDATE_URL);