好人。我在script.php
文件中有一个基本的正则表达式匹配项。
<?php
$str = "ABC";
echo ( preg_match( "|AB(C)|", $str) ) . PHP_EOL;
?>
当我从命令行执行代码时,按预期,输出为1。
php script.php
1
现在使用Apache Http作为PHP运行时环境,使用完全相同的参数调用preg_match()
:
<!DOCTYPE HTML>
<html>
<body>
<?php
$str = "ABC";
if ( preg_match( "|AB(C)|", $str) ) {
$res = 'matches';
} else {
$res = 'no match';
}
echo $res;
?>
</body>
<html>
结果为no match
。
这怎么可能?显然ldd
和httpd
链接到相同的libpcre版本。
ldd /usr/local/bin/php | grep libpcre
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007faa7e217000)
ldd /usr/sbin/httpd | grep libpcre
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fd9e3c75000)
php -i
和phpinfo()
返回相同版本的PCRE库和配置。
PCRE (Perl Compatible Regular Expressions) Support => enabled
PCRE Library Version => 8.38 2015-11-23
PCRE JIT Support => enabled
pcre.backtrack_limit => 1000000 => 1000000
pcre.jit => 1 => 1
pcre.recursion_limit => 100000 => 100000
find / -name libpcre.*
返回多个结果:
/usr/lib64/pkconfig/libpcre.pc
/usr/lib64/libpcre.so.1.2.9
/usr/lib64/libpcre.so
/usr/lib64/libpcre.so.1
/usr/lib64/pkconfig/libpcre.pc
指向PCRE版本8.41,pcre-config --version
也返回该版本。这可能是系统版本。
/usr/lib64/libpcre.so
和/usr/lib64/libpcre.so.1
是指向
/usr/lib64/libpcre.so.1.2.9
。
我正在运行Apache/2.4.27
和PHP/7.1.11
操作系统版本为Fedora 24
。