您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

在PHP中模拟LIKE

在PHP中模拟LIKE

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

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)成令牌以生成正则表达式,而不是就地将其转换为正则表达式。

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

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

这是它的键盘

糟糕,已损坏,现在已修复。新键盘

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

一些小修正/改进:

php 2022/1/1 18:52:25 有347人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶