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

时间:2015-12-01 08:39:52

标签: php regex preg-replace

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

例如,如果在代码中的任何地方(注释区域除外)找到fopen(),那么

替换

 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(),也来自注释" #you可以使用mkdir()函数创建一个新的目录。"

正则表达式中有没有办法在评论中排除匹配?

我只想替换评论区域之外的函数。

2 个答案:

答案 0 :(得分:1)

这可以使用像这样的正则表达式对所有类型的PHP注释进行:

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

<强>勒亘

  • ^线的开头(感谢最后的m多线修改器)
  • (?:(?!(?://|#|/\*)).)*多次顽固的贪婪位置检查。验证行中的文字,直到它不包含#///*
  • \K此时重置正则表达式引擎选择的文本(丢弃上述表达式验证的所有文本)。
  • ((?:mkdir|fopen)\s*\()选择2个函数中的一个,后跟零个或多个空格(或制表符)和一个打开的圆括号。

试试这个Demo Online

<强>更新

添加了running demo

的代码片段
<?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);

?>

CAVEAT

  • 这不会处理字符串中注释指示符的(远程)情况,就像字符串"...#...""...//..."".../*..."
  • 当函数不是内联时,不能正确处理多行注释/* ... */。 (/*...mkdir()...*/mkdir /*...\n...mkdir()...*/\nmkdir被注释掉的情况下被跳过Convert。{/ li>

答案 1 :(得分:1)

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

  1. 用“"~~^^~~"
  2. 之类的其他特殊字符串替换”“或”中的所有特殊字符串
  3. 执行您之前的替换
  4. 将“~~ ^^ ~~”改回正常状态。
  5. 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);