我的网站有小搜搜文本柜,我想让用户直接输入regex(有说明怎样写)。
在后端的PERL-CGI(perl v5.16)我打算这样写:
sub search {
# $options 值为数字,结构如下:
# 0x1 = 不分小写/大写
# 0x2 = 查找完成词
my ($text,$pattern,$options)=@_;
my $pattern=$_[1];
my $options=$_[2];
my $mods="";
if($options & 0x1) { $mods="i"; }
if($options & 0x2) { $pattern="\\b$pattern\\b"; }
my $res={};
my $idx=0; # 这个用来提供行号
use re 'eval'; # 这个是安全的问题!!!
for my $str(split(/\n/,$text)) {
$idx++; # 行号从1开始
my @mt= $str =~ m/${pattern}/${mods} ;
my ($b,$e)=(0,0);
for my $j(@mt) {
unless($res->{$idx}){ $res->{$idx}={}; }
$b=index($str,$j,$e); $e=$b+length($j);
$res->{$idx}{$b}="<pre>".substr($str,$b-20>0?$b-20:0,$b-20>0?20:$b)."<span class=\"ef-srch-rec\">$j</span>".substr($str,$e,20)."</pre>";
}
}
return $res;
}
问题可以看得到在“use re 'eval';”这一行,有没有安全的方法和JavaScript的new RegExp(pattern,'g'+mods)差不多?
最好如果不需要用插件, 谢谢
你的意思是用户输入的字符串作为正则表达式内容?直接这样不行吗: