PERL有没有和Javascript的RegExp相同公式(不用插件)?

新手上路,请多包涵

我的网站有小搜搜文本柜,我想让用户直接输入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)差不多?
最好如果不需要用插件, 谢谢

阅读 1.1k
1 个回答

你的意思是用户输入的字符串作为正则表达式内容?直接这样不行吗:

my $user_input = "some_regex_expression";

# 直接用
if ($foo =~ /$user_input/) { do_something; }

# 预编译
my $regex_from_user_input = qr/$user_input/;
if ($foo =~ $regex_from_user_input) { do_something; }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏