3 Stimmen

Wie kann man mit PHP einen SQL LIKE-Abgleich ohne Datenbankabfrage durchführen?

Ich möchte eine Eingabezeichenfolge auf meiner PHP-Seite auf die gleiche Weise abgleichen, wie dies mit dem LIKE-Befehl in SQL (MySQL) geschieht, um die Konsistenz anderer Suchen zu gewährleisten. Da (ich habe gesehen, aber nicht verstehen) einige der PHP-Syntax enthält SQL-Befehle ich frage mich, ob dies möglich ist?

Der Grund dafür ist, dass ich jetzt eine Suche nach einem Schlüsselwort im Vergleich zu Feldern in der DB implementiere, die in einem serialisierten Array gespeichert sind, das ich in PHP desialisieren und je nach Struktur des Arrays suchen muss. Ich kann die Tabelle nicht abfragen, sondern benötige nur die Abgleichsfunktion der Abfrage. Andernfalls muss ich eine alternative Abgleichsroutine finden, die nicht konsistent sein wird. Ich kann nicht zurückgehen und die DB neu strukturieren, da dies in der Spezifikation nicht vorgesehen war. Ja, ich brauche einen hässlichen Hack, aber ich suche nach dem elegantesten.

Wenn dies nicht möglich ist, könnte ich jede Empfehlung zum Abgleich von vom Benutzer eingegebenem Text mit gespeichertem Text verwenden.

EDIT (zur Klarstellung): mein Hauptproblem ist, dass ich nicht genau weiß, wie der LIKE-Befehl funktioniert (ich kopiere nur den Code), und da das Schlüsselwort ein gewisses Maß an Vagheit impliziert, möchte ich, dass diese Vagheit erhalten bleibt, wenn ich zu einem regulären Ausdruck wechsle. Ich bin besser mit Regex, aber nicht so gut mit like. Meine Abfrage lautet "LIKE 'matchme%'".

0 Stimmen

Wie sieht die Abfrage aus der Sicht des Benutzers aus? Dürfen sie Wildcards wie "%" eingeben oder nur reinen Text?

0 Stimmen

Der Benutzer gibt den Text ein, ich füge die Platzhalter im Hintergrund hinzu. Ich verwende ein %. LIKE 'text%'

0 Stimmen

Kumpel - LIKE ist deterministisch. Es ist eine Stringsuche. Tun Sie es in der DB.

7voto

Peter Bailey Punkte 103278

Update

Aufgrund des Kommentars von tomalak und der brillanten Idee von OIS, preg_grep zu verwenden, könnte dies eher eine endgültige Lösung für Sie sein.

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

Originalbeitrag unten

Entspricht das dem, was Sie suchen?

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

4voto

OIS Punkte 9481

Was Sie brauchen, ist preg_grep tatsächlich.

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

führt zu

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

bearbeiten:

der Benutzer den Text eingibt, füge ich die Wildcards hinter den Kulissen hinzu. Ich verwende ein %. LIKE 'text%'

So geben Sie es in regex an

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

Denken Sie auch an die Verwendung von preg_quote auf jeden Text, den Sie von einem Dritten erhalten. $regex = "#" . preg_quote($text) . "#i"; $res = preg_grep($regex, $arr);

0voto

Barry Punkte 492

Ich denke, Sie brauchen preg_match aber das ist nicht genau das gleiche Verhalten wie ein 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."; } 
?>

0voto

ryanday Punkte 2436

Meinen Sie, dass Sie prüfen wollen, ob die Eingabezeichenfolge LIKE var% ist?

Sie könnten strpos(haystack, needle) verwenden, um %var% abzugleichen.

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

Das ist ziemlich hässlich. Und wahrscheinlich auch nicht das eleganteste.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X