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

有没有一种很好的方法来测试一个字符串是否是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

有任何想法吗?


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

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

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


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

if( preg_match("/^/.+/[a-z]*$/i",$regex))

这会告诉你一个字符串是否有很好的机会成为正则表达式。 然而,有很多字符串会通过检查,但不能成为正则表达式。 中间的非反斜杠,最后未知的修饰符,不匹配的括号等都可能导致问题。

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字符的中间)

  • 为什么不只是使用...另一个正则表达式? 三行,没有@ kludges或任何东西:

    // Test this string
    $str = "/^[A-Za-z ]+$/";
    
    // Compare it to a regex pattern that simulates any regex
    $regex = "/^/[sS]+/$/";
    
    // Will it blend?
    echo (preg_match($regex, $str) ? "TRUE" : "FALSE");
    

    或者,在功能上,更加漂亮:

    public static function isRegex($str0) {
        $regex = "/^/[sS]+/$/";
        return preg_match($regex, $str0);
    }
    

    这不检验有效性; 但它看起来像问题Is there a good way of test if a string is a regex or normal string in PHP? 它确实做到了。

    链接地址: http://www.djcxy.com/p/76743.html

    上一篇: Test if a string is regex

    下一篇: Regular expression for regular expressions?