有没有一种方法可以使用相同的语法在PHP中模拟SQL的LIKE运算符? (%_通配符以及通用$escape转义字符)?
这样具有:

$value LIKE $string ESCAPE $escape

您可以使用不返回数据库即可返回PHP评估的函数?
(考虑已设置$value$string$escape值)。

最佳答案

好吧,经过很多的娱乐和游戏,这是我想出的:

function preg_sql_like ($input, $pattern, $escape = '\\') {

    // Split the pattern into special sequences and the rest
    $expr = '/((?:'.preg_quote($escape, '/').')?(?:'.preg_quote($escape, '/').'|%|_))/';
    $parts = preg_split($expr, $pattern, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

    // Loop the split parts and convert/escape as necessary to build regex
    $expr = '/^';
    $lastWasPercent = FALSE;
    foreach ($parts as $part) {
        switch ($part) {
            case $escape.$escape:
                $expr .= preg_quote($escape, '/');
                break;
            case $escape.'%':
                $expr .= '%';
                break;
            case $escape.'_':
                $expr .= '_';
                break;
            case '%':
                if (!$lastWasPercent) {
                    $expr .= '.*?';
                }
                break;
            case '_':
                $expr .= '.';
                break;
            default:
                $expr .= preg_quote($part, '/');
                break;
        }
        $lastWasPercent = $part == '%';
    }
    $expr .= '$/i';

    // Look for a match and return bool
    return (bool) preg_match($expr, $input);

}

我无法打破它,也许您会找到可以的东西。我的不同于@nickb的主要方法是,我的将输入表达式“解析”(ish)成 token 以生成正则表达式,而不是就地将其转换为正则表达式。

该函数的前三个参数应该很容易解释。第四个允许您传递PCRE modifiers来影响用于比赛的最终正则表达式。我输入此代码的主要原因是允许您传递i,因此它不区分大小写-我想不出任何其他可以安全使用的修饰符,但事实并非如此。从下面的评论中删除

函数仅返回一个 bool 值,指示$input文本是否与$pattern匹配。

Here's a codepad of it

EDIT 糟糕,已修复,现已修复。 New codepad

编辑删除了第四个参数,并根据下面的注释使所有匹配项均不区分大小写

编辑一些小修正/改进:
  • 在生成的正则表达式
  • 中添加了字符串声明的开始/结束
  • 添加了对最后一个 token 的跟踪,以避免在生成的正则表达式
  • 中出现多个.*?序列

    10-07 14:54