最近我在一个简单的代码中看到了一个问题:
$regexp = "^((http://)|(https://)|(mailto:)|(ftp://))?(([a-zA-Z0-9_.!~*'()-]|(%[0-9a-fA-F]{2})|[;&=+$,])+(:([a-zA-Z0-9_.!~*'()-]|(%[0-9a-fA-F]{2})|[;:&=+$,])+){0}@){0}((((((2(([0-4][0-9])|(5[0-5])))|([01]?[0-9]?[0-9]))\.){3}((2(([0-4][0-9])|(5[0-5])))|([01]?[0-9]?[0-9]))))|(([a-zA-Z0-9](([a-zA-Z0-9-]{0,62})[a-zA-Z0-9])?\.)*([a-zA-Z](([a-zA-Z0-9-]*)[a-zA-Z0-9])?)))?(:(([0-5]?[0-9]{1,4})|(6[0-4][0-9]{3})|(65[0-4][0-9]{2})|(655[0-2][0-9])|(6553[0-5])))?(/((;)?([a-zA-Z0-9_.!~*'()-]|(%[0-9a-fA-F]{2})|[:@&=+$,])+(/)?)*)?(\?([;/?:@&=+$,]|[a-zA-Z0-9_.!~*'()-]|(%[0-9a-fA-F]{2}))*)?(#([;/?:@&=+$,]|[a-zA-Z0-9_.!~*'()-]|(%[0-9a-fA-F]{2}))*)?$";
$urladdr = '89.221.92.122/api/xml';
$result = eregi($regexp, $urladdr);
wamp server返回true,而xampp服务器返回false!我知道eregi已被弃用,但是我知道我希望它能在php 5.3.1中正常工作
My Question
是否有任何php或apache配置导致此行为?
脚本的简单测试文件在此处上传:eregi on xampp + phpinfo
我的wamp中的上述代码位于:eregi on wamp + phpinfo
我不希望你解决我的问题,我只是想知道为什么这样 发生了一些问题。
答案 0 :(得分:3)
似乎POSIX“扩展正则表达式”模块/扩展可以利用本机系统支持或使用与PHP源捆绑在一起的实现。我没有找到任何明确的参考,但有线索:
ext/ereg/php_regex.h
phpinfo()
输出包含“已启用捆绑库”行。 (顺便说一下,我找到了输出:ext/ereg/ereg.c
line 238。这实际上很常见于PHP的许多旧部分,它们最初构建在系统库和API上,可以在“POSIX兼容”系统上可靠地找到,并且稍后通过重新实现“移植”到其他系统所需的功能。这会导致平台之间出现一些差异,特别是在Windows上,大多数预期的库都会丢失。
PHP的最新版本试图识别并纠正这种不一致性 - 例如,许多与文件系统相关的函数曾经在Windows下发出有限或不正确行为的警告,但现在在特定版本中将其显示为已修复。但是,由于这个特定的扩展已被弃用,支持跨平台PCRE库,因此即使在PHP 5.3中添加了官方弃用通知之前,也可能没有对其不同实现进行大量测试。
答案 1 :(得分:1)
eregi
已被弃用!请改用preg
。