Pergunta

Eu quero corresponder uma cadeia de entrada à minha página PHP da mesma forma um jogo feito pelo comando LIKE em SQL (MySQL) para a consistência de outras pesquisas. Uma vez que (eu já vi, mas não compreendem) alguns da sintaxe PHP inclui comandos SQL Eu estou querendo saber se isso é possível?

A razão para isso é que eu estou agora a implementar uma pesquisa de uma palavra-chave contra campos no banco de dados que são armazenados em uma matriz serializada, que eu tenho que unserialize em PHP e procurar dependendo da estrutura da matriz. Eu não posso consulta a tabela, só precisa a capacidade de correspondência da consulta. Caso contrário, eu preciso encontrar uma rotina correspondente alternativa, que não será consistente. Eu não posso voltar e re-estrutura do DB uma vez que este não foi antecipado wayyy volta na spec. Sim, eu preciso de um corte feio, mas estou procurando o mais elegante.

Se não for possível, eu poderia usar qualquer recomendação de usuário correspondente texto digitado como uma palavra-chave contra o texto armazenado.

Editar (para esclarecimento): o meu principal problema é que eu não tenho uma compreensão profunda sobre como funciona o comando como (apenas copiar o código) e como a palavra-chave implica algum grau de imprecisão, gostaria que indefinição preservada se eu mudar para uma expressão regular. Eu sou melhor com regex não é apenas tão bom com gosto. Minha pergunta é "como 'matchme%'"

Foi útil?

Solução

Atualização

Com base no comentário de Tomalak e brilhante idéia de OIS para uso preg_grep, isso pode ser algo mais ao longo das linhas de uma solução definitiva para você.

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

Original post abaixo

É este ao longo das linhas de que você está depois?

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

Outras dicas

O que você precisa é preg_grep na verdade.

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

resultado em

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

edit:

o usuário fornece o texto, eu adicionar o curingas nos bastidores. Eu faço uso 1 %. 'Text%' COMO

aqui é como você especificá-lo no regex

"#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"

Além disso, lembre-se de usar preg_quote em qualquer texto você começa a partir de um terceiro. $ Regex = "#". preg_quote ($ text). "#Eu"; $ Res = preg_grep ($ regex, $ arr);

Eu acho que você precisa preg_match mas isso não é exatamente o mesmo comportamento como um COMO .

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

Você quer dizer que você quer ser capaz de verificar se a cadeia de entrada é como var%?

Você pode usar strpos (palheiro, agulha) para corresponder% var%.

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

Isso é muito feio. E na verdade, provavelmente não é o mais elegante.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top