在wamp和xampp中奇怪的php eregi行为

时间:2013-07-25 18:33:27

标签: php eregi posix-ere

最近我在一个简单的代码中看到了一个问题:

$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

  

我不希望你解决我的问题,我只是想知道为什么这样   发生了一些问题。

2 个答案:

答案 0 :(得分:3)

似乎POSIX“扩展正则表达式”模块/扩展可以利用本机系统支持或使用与PHP源捆绑在一起的实现。我没有找到任何明确的参考,但有线索:

  • the extension's "Installation" instructions中,描述了要编译的3个实现中的哪个实现的选项。我注意到其中一个选项是“apache”,暗示即使在Windows下,“第三方”实现也可能是可用。
  • 您可以浏览实际加载实现的源代码,例如: ext/ereg/php_regex.h
  • 中的一系列if语句
  • 您发布的phpinfo()输出包含“已启用捆绑库”行。 (顺便说一下,我找到了输出:ext/ereg/ereg.c line 238
  • 的来源

这实际上很常见于PHP的许多旧部分,它们最初构建在系统库和API上,可以在“POSIX兼容”系统上可靠地找到,并且稍后通过重新实现“移植”到其他系统所需的功能。这会导致平台之间出现一些差异,特别是在Windows上,大多数预期的库都会丢失。

PHP的最新版本试图识别并纠正这种不一致性 - 例如,许多与文件系统相关的函数曾经在Windows下发出有限或不正确行为的警告,但现在在特定版本中将其显示为已修复。但是,由于这个特定的扩展已被弃用,支持跨平台PCRE库,因此即使在PHP 5.3中添加了官方弃用通知之前,也可能没有对其不同实现进行大量测试。

答案 1 :(得分:1)

eregi已被弃用!请改用preg

请参阅:How can I convert ereg expressions to preg in PHP?