データベースクエリなしSQL LIKEマッチングを実行するためにPHPの方法はありますか?

StackOverflow https://stackoverflow.com/questions/562823

質問

私は同じように私のPHPページに他の検索の一貫性のためのSQL(MySQLの)でLIKEコマンドによって行わマッチを入力文字列にマッチします。 (私が見てきたが、理解していない)PHPの構文の一部は、SQLコマンドが含まれているため、これが可能である場合、私は疑問に思って?

この理由は、私は今、私は配列の構造に応じて、PHPや検索にアンシリアライズする必要がシリアライズされた配列に格納されているDBのフィールド、対キーワードの検索を実装しています。私は、クエリのマッチング能力を必要とし、テーブルに対してクエリを実行することはできません。そうでなければ私は一貫性がないであろう代替マッチングルーチンを、見つける必要があります。これはwayyyバック仕様で予想されていなかったので、私はDBに戻って再構成することはできません。はい、私は醜いハックが必要ですが、最もエレガントな探しています。

それが不可能な場合は、

は、私が格納されているテキストに対してキーワードとして一致するユーザー入力したテキストの任意の勧告を使用することができます。

(明確にするため)

編集:私の主な問題は、私はLIKEコマンドの動作(単にコードをコピー)し、キーワードとして曖昧ある程度の意味は、私があれば、保存その曖昧さをご希望の方法を徹底的に理解を持っていないです私は正規表現に切り替えます。私のようでただあまりよくない正規表現のに優れています。私のクエリは、

"LIKE 'matchmeの%'" です
役に立ちましたか?

解決

更新

tomalakさんのコメントとpreg_grepを使用するには、OISの華麗な考えに基づき、これはあなたのための最終的な解決策の線に沿ってより多くの何かかもしれません。

<?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>';
}
以下は、

オリジナルポスト

これはあなたが後にしているものの線に沿ってますか?

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

他のヒント

あなたが必要なもの、実際に 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"
}

編集ます:

  

ユーザーがテキストを提供し、私が追加します   舞台裏でワイルドカード。私が使うのですか   1 %。 LIKE 'テキスト%'

ここでは、あなたが正規表現で指定する方法です。

"#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 を使用することを忘れないでくださいあなたは、第三者から取得します。 $正規表現= "#"。 preg_quote($テキスト)。 "#私"; $ RES = preg_grep($の正規表現は、$ arrが);

私はあなたがする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."; } 
?>

あなたが入力文字列がVaRの%のようなものであるかどうかを確認できるようにしたいわけですか?

あなたは%するvar%に一致するようにstrpos(干し草の山、針)を使用することができます。

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

これはかなり醜いです。そして、実際には、おそらく最もエレガントではない。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top