我从假定有效的 perl 正则表达式值的用户那里得到了一个输入列表。 示例可能是:
\b[Bb]anana\b
\s*Apples[BANANA]\s+
是否有安全的方法来验证这些字符串?
最佳答案
首先,考虑您想让用户使用某种模式的程度。 Perl 正则表达式可以运行任意代码。
但是,要验证您可以将字符串用作模式而不导致 fatal error ,您可以使用 qr//
运算符编译字符串并返回正则表达式。如果出现问题,qr
会给您一个 fatal error ,您可以使用 eval
捕获该错误:
my $pattern = eval { qr/$input/ };
如果返回 undef
,则模式无效。而且,尽管问题中有评论,但有无数种方法可以制作无效模式。我知道,因为我一直都在手动输入它们,而且我没有用尽各种方法来搞砸 :)
这不会将模式应用于字符串,但您可以使用 $pattern
进行匹配:
if( $pattern ) {
$target =~ $pattern; # or $target =~ m/$pattern/
}
https://stackoverflow.com/questions/69890532/