测试字符串是否是正则表达式

Hos*_*diq 19 php regex preg-match

如果字符串是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());
?>
Run Code Online (Sandbox Code Playgroud)

显然,第一个不是错误,第二个是错误.但两次preg_last_error()返回int 0.

有任何想法吗?

Nie*_*sol 12

测试字符串是否为正则表达式的最简单方法是:

if( preg_match("/^\/.+\/[a-z]*$/i",$regex))
Run Code Online (Sandbox Code Playgroud)

这将告诉您字符串是否有可能成为正则表达式.但是,有许多字符串可以通过该检查,但无法成为正则表达式.中间未转义的斜线,最后未知的修饰符,不匹配的括号等都可能导致问题.

preg_last_error返回0 的原因是因为"无效的正则表达式"不是:

  • PREG_INTERNAL_ERROR(内部错误)
  • PREG_BACKTRACK_LIMIT_ERROR(过度强制回溯)
  • PREG_RECURSION_LIMIT_ERROR(过度递归)
  • PREG_BAD_UTF8_ERROR(格式错误的UTF-8)
  • PREG_BAD_UTF8_OFFSET_ERROR(偏移到UTF-8字符的中间)

  • 另请注意,这仅适用于带有 `/` 分隔符的正则表达式。 (2认同)

Ben*_*Ben 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");
Run Code Online (Sandbox Code Playgroud)

或者,在功能形式,更漂亮:

public static function isRegex($str0) {
    $regex = "/^\/[\s\S]+\/$/";
    return preg_match($regex, $str0);
}
Run Code Online (Sandbox Code Playgroud)

这不测试有效性; 但看起来问题是Is there a good way of test if a string is a regex or normal string in PHP?,它确实这样做了.


ya_*_*mon 10

这是一个很好的答案如何:

/sf/answers/905879341/

if(@preg_match($yourPattern, null) === false){
    //pattern is broken
}else{
    //pattern is real
}
Run Code Online (Sandbox Code Playgroud)


Thi*_*ter 8

测试正则表达式在PHP中是否有效的唯一简单方法是使用它并检查是否抛出警告.

ini_set('track_errors', 'on');
$php_errormsg = '';
@preg_match('/[blah/', '');
if($php_errormsg) echo 'regex is invalid';
Run Code Online (Sandbox Code Playgroud)

但是,使用任意用户输入作为正则表达式是一个坏主意.之前PCRE引擎中存在安全漏洞(缓冲区溢出=>远程代码执行),并且可能会创建特制的长正则表达式,这需要大量的cpu /内存来编译/执行.

  • 为什么这比仅检查preg_match的输出更好? (2认同)
  • 我的回答是2012年的... (2认同)