使用str_Replace()和regex将php函数替换为注释
我想为我的编辑器禁用一些php函数。如果用户使用任何禁用的函数发布代码,preg_replace会将其转换为注释 例如,如果在代码中的任何位置(不包括注释区域)都可以找到fopen(),那么 替换使用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
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
“~^^~~”
“~~^^~~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);