Улучшенная версия LIKE
перегрузки через UDF:
$db->sqliteCreateFunction('like',
function ($pattern, $data, $escape = null) use ($db)
{
static $modifiers = null;
if (isset($modifiers) !== true)
{
$modifiers = ((strncmp($db->query('PRAGMA case_sensitive_like;')->fetchColumn(), '1', 1) === 0) ? '' : 'i') . 'suS';
}
if (isset($data) === true)
{
if (strpbrk($pattern = preg_quote($pattern, '~'), '%_') !== false)
{
$regex = array
(
'~%+~S' => '.*',
'~_~S' => '.',
);
if (strlen($escape = preg_quote($escape, '~')) > 0)
{
$regex = array
(
'~(?<!' . $escape . ')%+~S' => '.*',
'~(?<!' . $escape . ')_~S' => '.',
'~(?:' . preg_quote($escape, '~') . ')([%_])~S' => '$1',
);
}
$pattern = preg_replace(array_keys($regex), $regex, $pattern);
}
return (preg_match(sprintf('~^%s$~%s', $pattern, $modifiers), $data) > 0);
}
return false;
}
);
Уважает case_sensitive_like
PRAGMA и правильно обрабатывает x LIKE y ESCAPE z
синтаксис .
Я также написал другую версию, которая поддерживает basic и расширенную латинизацию из x
и y
значений, так что акцентированный символ будет соответствовать его безударному аналогу, например: SELECT 'Á' LIKE 'à%';
.
Вы можете отметить звездочку , чтобы следить за случайными обновлениями.