我想为我的编辑器禁用一些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()函数创建一个新的目录。"
正则表达式中有没有办法在评论中排除匹配?
我只想替换评论区域之外的函数。
答案 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()...*/
(\n
)mkdir
被注释掉的情况下被跳过Convert
。{/ li>
答案 1 :(得分:1)
我没有一个聪明的答案,以下只是一种不好但可以解决的方法。
"~~^^~~"
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);