如何停止解析错误并获取代码在PHP 5和7中工作

问题描述:

我有一台服务器,但它只有PHP 5,此时我有一条断臂,所以移动(只是键入这个)是一个杀手。如何停止解析错误并获取代码在PHP 5和7中工作

我认为PHP中内置的所有class_exists和function_exists函数至少可以向后兼容,但是PHP似乎只是删除了不同于其他语言的功能而没有很好地处理它我遇到了删除\ e修饰符的问题常用表达。

例如,我有这个正则表达式,可以在完全停止后去除单词的单词,如果它们是单个单词,例如“Hello Rob Reid。说酒吧的人”是“Hello Rob Reid。酒吧的人说” - 不用担心语法这些点稍后用作占位符。

所以这在PHP 5

$content = preg_replace("/(\.[”’\"]?\s*[A-Z][a-z]+\s[a-z])/e","strtolower('$1')",$content); 

是工作但在PHP 7不和\ e修饰符已被删除。

所以在PHP 7中,我必须这样做。

$content = preg_replace_callback("@(\.[”’\"]?\s*[A-Z][a-z]+\s[a-z])@", 
         function ($matches) { 
         return strtolower($matches[0]); 
         }, 
         $content); 

不过,我需要的代码,将工作的用户是否有PHP5或PHP7,我不能强迫他们升级我只需要确定没有分析器引发错误使用哪个分支。

我认为一个简单的error_reporting(0);function_exists("preg_replace_callback"); 会工作,但它似乎并不。我试过online PHP testers like this one评估代码。

但是我得到解析错误,即使我把error_reporting(0);在脚本的顶部。

我想过一个函数来查看一个函数是否存在,并且可调用将像下面的函数一样工作,但是无济于事。

我想一个function_exists和is_callable组合将工作。

function is_function($name) 
{ 
    $ret = true; 

if(function_exists($name) && is_callable($name)){ 
    return $ret; 
}else{ 
    $ret = false; 
} 

echo "return " . intval($ret) . " from is_function\n"; 
return $ret; 
}` 

那么如何根据支持的函数(或PHP版本)支持主函数中的代码呢?

你可以这个代码全位复制到the sandbox tester并运行它...

<?php 
error_reporting(0); 
echo "start\n"; 
$content = "Hello Rob Reid said the bar man. He walked away.\n\n"; 

echo $content; 

if(is_function("preg_replace_callback")){ 
    echo "function does exist\n"; 
    @$content = preg_replace_callback("@(\.[”’\"]?\s*[A-Z][a-z]+\s[a-z])@", 
         function ($matches) { 
         return strtolower($matches[0]); 
         }, 
         $content); 
}else{ 
    echo "function does not exist\n"; 
    $content = preg_replace("/(\.[”’\"]?\s*[A-Z][a-z]+\s[a-z])/e","strtolower('$1')",$content); 
} 

function is_function($name) 
{ 
    $ret = true; 

    if(function_exists($name) && is_callable($name)){ 
     return $ret; 
    }else{ 
     $ret = false; 
    } 

    echo "return " . intval($ret) . " from is_function\n"; 
    return $ret; 
} 


echo "new content\n\n"; 
echo $content . "\n\n"; 
echo "stopped"; 

并观察输出的变化,因为它击中PHP 5.217,那么你得到的错误,例如


解析错误:语法错误,意外的T_FUNCTION [...]在线

因此,任何想法如何在相同的类文件中分支PHP版本看到他们不能保持/ e修饰符或处理新的回调>

非常感谢您的任何帮助。

+0

摆脱匿名功能,它会工作。 https://3v4l.org/MNDak – chris85

+0

但我需要它的匿名函数在PHP7中工作我需要它在PHP5和PHP7或任何版本的语言中工作。我知道使用PHP7的人用新的匿名回调代码替换旧代码,以使其工作正常,但使用PHP5的人仍然需要它来工作,因此它可以与两组代码一起工作。它应该使用is_function函数来测试它是否会运行,但由于某种原因它不会运行,除非我需要将其他变量放入其他函数中,例如is_function(“callback”); – MonkeyMagix

+0

PHP7不需要匿名函数。该页面正在测试PHP 7.2 - 4.3。 – chris85

你有两个选择:

  1. 创建一个正常功能,并把它传递给preg_replace_callback
  2. 使用create_function创建一个匿名函数:
$content = preg_replace_callback("@(\.[”’\"]?\s*[A-Z][a-z]+\s[a-z])@", 
         create_function('$matches', 'return strtolower($matches[0]);'), 
         "Hello Rob Reid. Said the bar man"); 

Live demo

但是被后者那么你可能会使用已过时的功能的PHP 7.2来了。

+0

只需创建一个函数应该在每个版本中工作。我会远离'create_function'。有关该功能的手册中的附加说明'此功能在内部执行eval(),因此具有与eval()相同的安全问题。此外,它具有不良的性能和内存使用特征。“# – chris85

+0

它在罕见的情况下不会在严格的数据验证中带来漏洞,但如果你在意,你会看到我警告OP也不要这样做。不过这是一个选项。 – revo

+0

是的,我看到弃用警告,我认为有关安全和性能问题的说明也会很好,但..或链接(http://php.net/manual/en/function.create-function.php)和注意注意那里的笔记。 – chris85