我遇到了来自regexlib的正则表达式问题。我试图在一些文本上做preg_replace()并想要替换/删除电子邮件地址和URL(http / https / ftp)。
我所拥有的代码是:
$sanitiseRegex = array(
'email' => /'^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/',
'http' => '/^(http|https|ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~])*$/',
);
$replace = array(
'xxxxx',
'xxxxx'
);
$sanitisedText = preg_replace($sanitiseRegex, $replace, $text);
但是我收到以下错误:未知修饰符'/'和 $ sanitisedText 为空。
任何人都可以看到我正在做的事情或正则表达式失败的原因吗?
谢谢
答案 0 :(得分:1)
首先,您的电子邮件字符串打开不正确:
'email' => /'^([a-zA-Z0-9_\-\.
// should be
'email' => '/^([a-zA-Z0-9_\-\.
另一个问题是你使用/
作为一个字符匹配并使用它开始/结束你的URL正则表达式,而不是在正则表达式中转义它们。简单地使用不同的字符来表示正则表达式的开始/结束的最简单的解决方案,即:
'http' => '@^(http|https|ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~])*$@'
正在发生的事情是它将'^(http|https|ftp)\:'
视为正则表达式,然后开始寻找选项。正则表达式“结束”之后的第一个字符是另一个'/'
,这是一个无效选项,因此是错误消息。
编辑:可以解决问题的快速方法:不匹配。您可以尝试以下方法:
'http' => '@^(http|https|ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?(/[a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~]*)?$@'