Question

Je veux correspondre à une chaîne d'entrée à ma page PHP de la même façon un match par la commande LIKE dans SQL (MySQL) pour la cohérence des autres recherches. Depuis (je l'ai vu, mais ne comprennent pas) une partie de la syntaxe PHP inclut des commandes SQL Je me demande si cela est possible?

La raison est que je suis maintenant une recherche de mise en œuvre d'un mot clé par rapport à des champs dans la base de données qui sont stockées dans un tableau sérialisé, que je dois unserialize en PHP et la recherche en fonction de la structure du tableau. Je ne peux pas interroger sur la table, juste besoin de la capacité d'adaptation de la requête. Sinon, je dois trouver une routine d'appariement alternatif, qui ne sera pas cohérente. Je ne peux pas revenir en arrière et structure la DB depuis cela n'a pas été prévu wayyy retour dans les spécifications. Oui, je besoin d'un bidouille horrible, mais je cherche le plus élégant.

S'il est impossible que je pourrais utiliser toute recommandation de l'utilisateur correspondant du texte tapé un mot clé contre le texte stocké.

EDIT (pour des précisions): mon principal problème est que je n'ai pas une connaissance approfondie sur la façon dont les travaux de commande comme (simplement copier le code) et que le mot-clé implique un certain degré d'imprécision, je voudrais que l'imprécision conservée si Je passe à une expression régulière. Je suis mieux avec regex tout simplement pas si bon avec comme. Ma requête est "LIKE '% matchme'"

Était-ce utile?

La solution

Mise à jour

D'après le commentaire de Tomalak et brillante idée de OIS utiliser preg_grep, cela pourrait être quelque chose de plus le long des lignes d'une solution finale pour vous.

<?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 ci-dessous

Est-ce le long des lignes de ce que vous êtes après?

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

Autres conseils

Je pense que vous auriez besoin preg_match mais ce n'est pas exactement le même comportement que 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."; } 
?>

Voulez-vous dire que vous voulez être en mesure de vérifier si la chaîne d'entrée est comme var%?

Vous pouvez utiliser strpos (botte de foin, aiguille) pour correspondre%% var.

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

C'est assez laid. Et en fait probablement pas le plus élégant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top