搜索文本时网址和电子邮件正则表达式出现问题

时间:2010-05-16 21:48:15

标签: php regex

我遇到了来自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 为空。

任何人都可以看到我正在做的事情或正则表达式失败的原因吗?

谢谢

1 个答案:

答案 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\-\._\?\,\'/\\\+&%\$#\=~]*)?$@'