php5 ereg,ereg / eregi替代PHP 5.3

本问题已经有最佳答案,请猛点这里访问。

很抱歉提出一个问题,但是对于理解正则表达式代码毫无用处。

在我没有写的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个字符的子域的功能。

@科林...看到...很高兴我们在哪里可以提供帮助....

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值