Domanda

Voglio abbinare una stringa di input alla mia pagina PHP allo stesso modo un match eseguito dal comando LIKE in SQL (MySQL) per la coerenza di altre ricerche. Dal momento che (ho visto, ma non capire) un po 'della sintassi di PHP include comandi SQL Mi chiedo se questo è possibile?

La ragione di questo è ora sto implementando una ricerca di una parola chiave contro i campi nel DB che sono memorizzati in un array serializzato, che devo unserialize in PHP e di ricerca a seconda della struttura della matrice. Non posso interrogare contro il tavolo, basta la capacità di corrispondenza della query. In caso contrario, ho bisogno di trovare una routine di corrispondenza alternativo, che non sarà coerente. Non posso tornare indietro e ri-struttura del DB dal momento che questo non è stato previsto wayyy indietro nelle specifiche. Sì, ho bisogno di un brutto hack, ma sto cercando il più elegante.

Se non è possibile che io possa usare qualsiasi raccomandazione di abbinare il testo digitato dall'utente come parola chiave contro testo memorizzato.

EDIT (per chiarimenti): il mio problema principale è che non ho una conoscenza approfondita su come funziona il comando come (basta copiare il codice) e come la parola implica un certo grado di indeterminatezza, vorrei che la vaghezza conservato, se posso passare ad un'espressione regolare. Sono meglio con espressioni regolari del proprio non così buono con il simile. La mia domanda è "come 'MatchMe%'"

È stato utile?

Soluzione

Aggiornamento

In base a commento di Tomalak e brillante idea di OIS per usare preg_grep, questo potrebbe essere qualcosa di più lungo le linee di una soluzione definitiva per voi.

<?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 qui sotto

E 'questo sulla falsariga di quello che stai cercando?

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

Altri suggerimenti

Quello che vi serve è preg_grep realtà.

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

risultati in

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

modifica:

  

l'utente fornisce il testo, aggiungo il   jolly dietro le quinte. Io faccio uso   uno %. LIKE 'testo%'

ecco come si specifica in 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"

Inoltre, ricordarsi di usare funzione preg_quote su qualsiasi testo si ottiene da una terza parte. $ Regex = "#". la funzione preg_quote ($ testo). "#io"; $ Res = preg_grep ($ regex, $ arr);

Mi piacerebbe pensare che avresti bisogno preg_match ma non è esattamente lo stesso comportamento come COME .

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

Vuoi dire che si vuole essere in grado di verificare se la stringa di input è come var%?

Si potrebbe utilizzare strpos (pagliaio, ago) per abbinare% var%.

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

Questo è abbastanza brutto. E in realtà probabilmente non il più elegante.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top