PHP способ выполнить SQL-ПОДОБНОЕ сопоставление без запроса к базе данных?

StackOverflow https://stackoverflow.com/questions/562823

Вопрос

Я хочу сопоставить входную строку с моей PHP-страницей таким же образом, как сопоставление, выполняемое командой LIKE в SQL (MySQL) для согласованности других поисковых запросов.Поскольку (я видел, но не понимаю) некоторые синтаксисы PHP включают SQL-команды, мне интересно, возможно ли это?

Причина этого в том, что сейчас я реализую поиск по ключевому слову в сравнении с полями в базе данных, которые хранятся в сериализованном массиве, который я должен рассериализовать в PHP и выполнить поиск в зависимости от структуры массива.Я не могу выполнить запрос по таблице, мне просто нужна возможность сопоставления запроса.В противном случае мне нужно найти альтернативную процедуру сопоставления, которая не будет последовательной.Я не могу вернуться назад и переструктурировать базу данных, поскольку это никак не предполагалось в спецификации.Да, мне нужен уродливый взлом, но я ищу самый элегантный.

Если это невозможно, я мог бы использовать любую рекомендацию по сопоставлению введенного пользователем текста в качестве ключевого слова с сохраненным текстом.

РЕДАКТИРОВАТЬ (для уточнения):моя главная проблема в том, что я не имею полного представления о том, как работает команда LIKE (просто копирую код), и поскольку ключевое слово подразумевает некоторую степень неопределенности, я бы хотел, чтобы эта неопределенность сохранялась, если я переключусь на регулярное выражение.Я лучше разбираюсь в регулярных выражениях, просто не так хорош с like.Мой запрос "КАК 'matchme%'"

Это было полезно?

Решение

Обновить

Основываясь на комментарии томалака и блестящей идее OIS использовать preg_grep, это может быть чем-то более похожим на окончательное решение для вас.

<?php

function convertLikeToRegex( $command )
{
    return "/^" . str_replace( '%', '(.*?)', preg_quote( $command ) ) .  "$/s";
}

function selectLikeMatches( $haystack, $needle )
{
    return preg_grep( convertLikeToRegex( $needle ), $haystack );
}

$likeClauses = array(
    '%foo'
    ,'foo%'
    ,'%foo%'
);

$testInput = array(
    'foobar'
    ,'barfoo'
    ,'barfoobaz'
);

foreach ( $likeClauses as $clause )
{
    echo "Testing $clause:";
    echo '<pre>';
    print_r( selectLikeMatches( $testInput, $clause ) );
    echo '</pre>';
}

Оригинальное сообщение Ниже

Соответствует ли это тому, к чему вы стремитесь?

<?php

function convertLikeToRegex( $command )
{
    return "/^" . str_replace( '%', '(.*?)', $command ) .  "$/s";
}

$likeClauses = array(
    '%foo'
    ,'foo%'
    ,'%foo%'
);

$testInput = array(
    'foobar'
    ,'barfoo'
    ,'barfoobaz'
);

foreach ( $testInput as $test )
{
    foreach ( $likeClauses as $clause )
    {
        echo "Testing '$test' against like('$clause'): ";
        if ( preg_match( convertLikeToRegex( $clause ), $test ) )
        {
            echo 'Matched!';
        } else {
            echo 'Not Matched!';
        }
        echo '<br>';
    }
    echo '<hr>';
}

Другие советы

То, что вам нужно, это preg_grep ( прег_греп ) на самом деле.

$arr = array("tstet", "duh", "str");
$res = preg_grep("#st#i", $arr); //i for case insensitive
var_dump($res);

приводит к

array(2) {
  [0]=>
  string(5) "tstet"
  [2]=>
  string(3) "str"
}

Редактировать:

пользователь предоставляет текст, я добавляю подстановочные знаки за кулисами.Я действительно использую один %.КАК 'текст%'

вот как вы указываете это в регулярном выражении

"#st#i"  regex is the same as in sql "%st%"
"#^st#i" regex is the same as in sql "st%"
"#st$#i" regex is the same as in sql "%st"

Кроме того, не забудьте использовать preg_ цитата на любой текст, который вы получаете от третьей стороны.$регулярное выражение = "#" .preg_quote($text) ."#я";$res = preg_grep($ регулярное выражение, $ arr);

Я бы подумал, что тебе нужно прег_матч но это не совсем то же самое поведение, что и ЛАЙК.

<?php // The "i" after the pattern delimiter indicates a case-insensitive search 
if (preg_match("/php/i", "PHP is the web scripting language of choice.")) {
    echo "A match was found."; 
} else {
    echo "A match was not found."; } 
?>

Вы имеете в виду, что хотите иметь возможность проверить, похожа ли входная строка НА var% ?

Вы могли бы использовать strpos (стог сена, иголка) для сопоставления %var%.

if( strpos($source, "var") == 0 ) echo "matches var%";
if( strlen($source) - (strpos($source, "var")) == strlen("var") ) echo "matches %var";

Это довольно некрасиво.И на самом деле, вероятно, не самый элегантный.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top