本问题已经有最佳答案,请猛点这里访问。
很抱歉提出一个问题,但是对于理解正则表达式代码毫无用处。
在我没有写的php模块中,以下函数
function isURL($url = NULL) {
if($url==NULL) return false;
$protocol = '(http://|https://)';
$allowed = '([a-z0-9]([-a-z0-9]*[a-z0-9]+)?)';
$regex ="^". $protocol . // must include the protocol
'(' . $allowed . '{1,63}\.)+'. // 1 or several sub domains with a max of 63 chars
'[a-z]' . '{2,6}'; // followed by a TLD
if(eregi($regex, $url)==true) return true;
else return false;
}
有什么好心的人可以给我替换代码吗,用什么来替换eregi
更换它的目的是什么?
自PHP 5.3起,@ William,ereg,eregi,split等功能已被弃用(不仅弃用,而且已完全删除)。 阅读更多。
完全更换? stackoverflow.com/questions/9954064/ereg-eregi-replacement/
@William,但是该解决方案过于局限在这种情况下……如果他要将某些代码移植到PHP 5.3,则需要更通用的解决方案。
@Tomas,很公平。
很好的问题-在升级到PHP 5.3(不推荐使用ereg和eregi函数)时,这是必需的。取代
eregi('pattern', $string, $matches)
采用
preg_match('/pattern/i', $string, $matches)
(第一个参数中的尾随i表示忽略大小写,并且与eregi中的i相对应-在替换ereg调用的情况下只是跳过)。
但是请注意新旧模式之间的差异!该页面列出了主要的区别,但是对于更复杂的正则表达式,您必须更详细地了解POSIX regex(由旧的ereg / eregi / split函数等支持)和PCRE之间的区别。
但是在您的示例中,可以安全地将eregi调用替换为:
if (preg_match("%{$regex}%i", $url))
return true;
(请注意:%是定界符;通常使用斜杠/。您必须确保定界符不在正则表达式中或对其进行转义。在您的示例中,斜杠是$ regex的一部分,因此更多方便使用不同的字符作为分隔符。)
非常感谢Tomas,您是明星。
抱歉,托马斯您的解决方案给出了一个错误preg_match()[function.preg-match]:未知修饰符h是由}之后的i引起的
@科林,好吧,我明白了!这是因为在$ regex中也使用了定界符| ...因此我们必须使用$ regex中不存在的其他定界符,例如%(希望我没有再次忽略某些东西:-)。更新了我的答案。
非常感谢,这似乎已经解决了问题。最后一个问题。当匹配字母字符时,eregi忽略大小写区别。我现在拥有的代码仍然可以执行此操作,还是需要在$ allowed中添加更多内容?
@Colin,否,ignorecase选项是在preg_match的pattern参数末尾看到的尾部" i"。此新代码应与旧代码完全等效。
再一次感谢你。我非常感谢您提供的帮助和您的解释。
@Colin,不客气。
该文档说(带有i(PCRE_CASELESS)修饰符是什么意思?
缓和PHP 5.3,直到您替换所有不赞成使用的功能
if(!function_exists('ereg')) { function ereg($pattern, $subject, &$matches = []) { return preg_match('/'.$pattern.'/', $subject, $matches); } }
if(!function_exists('eregi')) { function eregi($pattern, $subject, &$matches = []) { return preg_match('/'.$pattern.'/i', $subject, $matches); } }
if(!function_exists('ereg_replace')) { function ereg_replace($pattern, $replacement, $string) { return preg_replace('/'.$pattern.'/', $replacement, $string); } }
if(!function_exists('eregi_replace')) { function eregi_replace($pattern, $replacement, $string) { return preg_replace('/'.$pattern.'/i', $replacement, $string); } }
if(!function_exists('split')) { function split($pattern, $subject, $limit = -1) { return preg_split('/'.$pattern.'/', $subject, $limit); } }
if(!function_exists('spliti')) { function spliti($pattern, $subject, $limit = -1) { return preg_split('/'.$pattern.'/i', $subject, $limit); } }
有趣的是,在我的特定版本的PHP 5.3下,初始化构造&$matches = []似乎失败了。
您是否想要完全替代preg_match和eregi?
if(!filter_var($URI, FILTER_VALIDATE_URL))
{
return false;
} else {
return true;
}
或电子邮件:
if(!filter_var($EMAIL, FILTER_VALIDATE_EMAIL))
{
return false;
} else {
return true;
}
eregi在PHP中已贬值,您必须使用preg_match
function isValidURL($url)
{
return preg_match('%^((https?://)|(www\.))([a-z0-9-].?)+(:[0-9]+)?(/.*)?$%i', $url);
}
if(isValidURL("http://google.com"))
{
echo"Good URL" ;
}
else
{
echo"Bad Url" ;
}
有关更多信息,请参见http://php.net/manual/en/function.preg-match.php
谢谢
:)
您的替换正则表达式不适用相同的规则
嘿,选民..你介意给出我为什么被拒绝的理由吗???
@meouw ...规则是验证有效的电子邮件地址...我遗漏了什么吗
问题是要用等价的东西替换ereg正则表达式-您的不等价-您的具有可选协议部分,例如,原始协议需要专门的协议
@meouw有人只是提供了一个非正则表达式示例,但没有被否决...我所提供的只是URL验证的替代品..我认为您应该已经离开Colin来决定其是否与他有关或现在有关。.我不代码有误...可能不是100%,但这并不意味着我应该被否决
谢谢你的支持.....
谢谢,我非常感谢您的答复。我的主机刚刚升级到PHP / 5.3.10,因此需要替换。在Baba提供的解决方案中,我唯一看不到的是原始功能检查1个或多个最多63个字符的子域的功能。
@科林...看到...很高兴我们在哪里可以提供帮助....