PHP способ выполнить сопоставление SQL LIKE без запроса к базе данных? - PullRequest
3 голосов
/ 19 февраля 2009

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

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

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

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

Ответы [ 4 ]

7 голосов
/ 19 февраля 2009

Обновление

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

<code><?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 '
'; }

Оригинальный пост ниже

Это то, что вы ищете?

<?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>';
}
4 голосов
/ 19 февраля 2009

Что вам нужно, это 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"
}

редактирование:

пользователь предоставляет текст, я добавляю маски за кулисами. Я использую один %. НРАВИТСЯ 'text%'

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

"#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_quote для любого текста, полученного от третьей стороны. $ regex = "#". preg_quote ($ text). "#я"; $ res = preg_grep ($ regex, $ arr);

0 голосов
/ 19 февраля 2009

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

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

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

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

0 голосов
/ 19 февраля 2009

Я думаю, вам понадобится preg_match , но это не совсем то же самое поведение, что и LIKE.

<?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."; } 
?>
...