Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用str_Replace()和regex将php函数替换为注释_Php_Regex_Preg Replace - Fatal编程技术网

使用str_Replace()和regex将php函数替换为注释

使用str_Replace()和regex将php函数替换为注释,php,regex,preg-replace,Php,Regex,Preg Replace,我想为我的编辑器禁用一些php函数。如果用户使用任何禁用的函数发布代码,preg_replace会将其转换为注释 例如,如果在代码中的任何位置(不包括注释区域)都可以找到fopen(),那么 替换 fopen(); 与 这是我到目前为止的最新进展 $code='#you can use the mkdir() function to make a new dir. mkdir("love"); echo "Hello world"; fopen("home.php");' ech

我想为我的编辑器禁用一些php函数。如果用户使用任何禁用的函数发布代码,preg_replace会将其转换为注释

例如,如果在代码中的任何位置(不包括注释区域)都可以找到fopen(),那么

替换

 fopen();

这是我到目前为止的最新进展

  $code='#you can use the mkdir() function to make a new dir.
 mkdir("love");
 echo "Hello world";
 fopen("home.php");'
 echo preg_replace("/(mkdir|fopen\(.*\))/i","#$1",$code);
它从两侧替换mkdir(),也从注释“您可以使用mkdir()函数生成新的dir。”

在正则表达式中是否有任何方法可以排除注释中的匹配


我只想替换注释区域之外的函数。

这可以使用如下正则表达式对所有类型的php注释执行:

~^(?:(?!(?://|#|/\*)).)*\K((?:mkdir|fopen)\s*\()~m
传奇人物:

  • ^
    行的开头(由于末尾的
    m
    多行修改器)
  • (?:(?!(?:///| | |/\*)*
    多重位置检查。验证行中的文本,直到它不包含
    /
    /*
  • \K
    此时重置正则表达式引擎所选的文本(放弃上述表达式验证的所有文本)
  • ((?:mkdir | fopen)\s*\()
    从两个函数中选择一个,后跟零个或多个空格(或制表符)和一个开放的圆括号
试试这个

更新

添加了带有


警告:

  • 这不会处理字符串中注释指示符的(远程)情况,就像字符串中的散列一样
  • 当函数未内联时,无法正确处理多行注释。(
    /*…*/
    /*…mkdir()…*/
    按预期工作,
    mkdir
    被跳过,而
    /*…\n…mkdir()…*/
    (注意
    \n
    mkdir
    被注释掉)

我没有一个明智的答案,以下只是一个不好但可以解决的方法

  • 将“”或“”中的所有特殊字符串替换为另一个特殊字符串,如
    “~^^~~”
  • 你以前有没有换过
  • 将“~~^^~~”更改回正常状态
  • PS:如果你有多个函数,你可以使用
    “~~^^~~1”、“~~~^^~~2”

    代码如下:

    $str = '"asdfasmkdir()sdljsdlffopen()sdfsd";fopen()';
    $regix = '/"(.*?)mkdir(.*?)"/';
    $changeArr = array(
        'mkdir' => '~~__~~1',
        'fopen' => '~~__~~2',
    );
    $newStr = $str;
    //first step
    foreach($changeArr as $k=>$v){
        $regix = '/(".*?)'.$k.'(.*?")/';
        $newStr = preg_replace($regix,'$1'.$v.'$2',$newStr);
    }
    var_dump($newStr);
    //second step
    //this is your code,by using $new Str
    //third step
    foreach($changeArr as $k=>$v){
        $regix = '/(".*?)'.$v.'(.*?")/';
        $newStr = preg_replace($regix,'$1'.$k.'$2',$newStr);
    }
    var_dump($newStr);
    

    你能发布你期望的输出吗?当然,输出应该是#mkdir(“love”)#fopen(“home.php”),而不是#mkdir()#mkdir(“love”)#fopen(“home.php”)。您的问题目前还不清楚。您可以这样排除以
    #
    开头的行中的匹配:。有人能帮我确定格式吗?我使用Cmd+K,并且不能更改它。只要这样做,编辑需要经过同行审查。Thanx,现在好多了!
    <?php
    
    $code = <<<CODE
    #you can use the mkdir() function to make a new dir.
    mkdir("love");
    echo "Hello world";
    fopen("home.php");
    //mkdir()
    /* fopen() */
    CODE;
    
    $re = "~^(?:(?!(?://|#|/\*)).)*\K((?:mkdir|fopen)\s*\()~m";
    
    echo preg_replace($re,"#$1",$code);
    
    ?>
    
    $str = '"asdfasmkdir()sdljsdlffopen()sdfsd";fopen()';
    $regix = '/"(.*?)mkdir(.*?)"/';
    $changeArr = array(
        'mkdir' => '~~__~~1',
        'fopen' => '~~__~~2',
    );
    $newStr = $str;
    //first step
    foreach($changeArr as $k=>$v){
        $regix = '/(".*?)'.$k.'(.*?")/';
        $newStr = preg_replace($regix,'$1'.$v.'$2',$newStr);
    }
    var_dump($newStr);
    //second step
    //this is your code,by using $new Str
    //third step
    foreach($changeArr as $k=>$v){
        $regix = '/(".*?)'.$v.'(.*?")/';
        $newStr = preg_replace($regix,'$1'.$k.'$2',$newStr);
    }
    var_dump($newStr);