如果字符串是PHP中的正则表达式或普通字符串,是否有一种好的测试方法?
理想情况下,我想编写一个函数来运行字符串,返回true或false。
我看了preg_last_error()
:
<?php
preg_match('/[a-z]/', 'test');
var_dump(preg_last_error());
preg_match('invalid regex', 'test');
var_dump(preg_last_error());
?>
显然,第一个不是错误,第二个是错误。但preg_last_error()
两次都会返回int 0
。
有什么想法吗?
答案 0 :(得分:12)
测试字符串是否为正则表达式的最简单方法是:
if( preg_match("/^\/.+\/[a-z]*$/i",$regex))
这将告诉您字符串是否有可能成为正则表达式。但是,有许多字符串可以通过该检查,但无法成为正则表达式。中间没有斜面的斜线,最后的未知修饰符,不匹配的括号等都可能导致问题。
preg_last_error
返回0的原因是因为“无效的正则表达式”不是:
答案 1 :(得分:10)
为什么不使用......另一个正则表达式?三行,没有@
kludges或任何东西:
// Test this string
$str = "/^[A-Za-z ]+$/";
// Compare it to a regex pattern that simulates any regex
$regex = "/^\/[\s\S]+\/$/";
// Will it blend?
echo (preg_match($regex, $str) ? "TRUE" : "FALSE");
或者,在功能形式上,更漂亮:
public static function isRegex($str0) {
$regex = "/^\/[\s\S]+\/$/";
return preg_match($regex, $str0);
}
这不测试有效性;但看起来问题是Is there a good way of test if a string is a regex or normal string in PHP?
,而且确实是这样。
答案 2 :(得分:9)
以下是一个很好的答案:
https://stackoverflow.com/a/12941133/2519073
if(@preg_match($yourPattern, null) === false){
//pattern is broken
}else{
//pattern is real
}
答案 3 :(得分:7)
测试正则表达式在PHP中是否有效的唯一简单方法是使用它并检查是否抛出警告。
ini_set('track_errors', 'on');
$php_errormsg = '';
@preg_match('/[blah/', '');
if($php_errormsg) echo 'regex is invalid';
然而,使用任意用户输入作为正则表达式是一个坏主意。之前PCRE引擎中存在安全漏洞(缓冲区溢出=&gt;远程代码执行),并且可能会创建特制的长正则表达式,这需要大量的cpu /内存来编译/执行。