有没有一种方法可以使用相同的语法在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
编辑删除了第四个参数,并根据下面的注释使所有匹配项均不区分大小写
编辑一些小修正/改进:
.*?
序列