Bir veritabanı sorgusu olmadan uyan GİBİ SQL çalıştırmak için PHP yolu?

5 Cevap php

Ben bir maç diğer aramalar tutarlılığı için SQL (MySQL) LIKE komutu ile yapılır aynı şekilde benim PHP sayfasına bir giriş dizesi maç istiyorum. PHP sözdizimi bazı SQL komutları içerir (ben görmedim ama anlamıyorlar) beri bu mümkün olup olmadığını merak ediyorum?

Bunun nedeni, şimdi ben PHP unserialize ve dizinin yapısına bağlı olarak aramak zorunda tefrika dizide, saklanan DB alanlara karşı bir anahtar kelime bir arama uygulama duyuyorum edilir. Ben sadece sorgu eşleşen yetenek gerekiyor, masanın karşı sorgu olamaz. Aksi halde tutarlı olmayacak bir alternatif eşleşen rutin bulmalıyız. Bu wayyy geri spec beklenen değildi çünkü geri dönüp yeniden yapı DB olamaz. Evet, çirkin kesmek gerekir, ama en zarif arıyorum.

Bu mümkün değilse ben depolanan metin karşı bir anahtar kelime olarak kullanıcı yazdığınız metin eşleşen herhangi bir öneri kullanabilirsiniz.

EDIT (açıklama için): Benim asıl sorun ben (sadece kod kopyalama) nasıl LIKE komutu eserler üzerinde kapsamlı bir kavrayışa sahip olmayan ve anahtar kelime belirsizlik bir ölçüde anlaşılacağı gibi ben geçerseniz, ben bu belirsizlik korunmuş isterim olduğunu normal bir ifade. Ben gibi ile sadece çok iyi değil regex yıllardan daha iyi duyuyorum. Benim sorgu "'MatchMe%' GİBİ" dir

5 Cevap

Update

Tomalak yorumuna ve preg_grep kullanmak OIS parlak fikir dayanarak, bu sizin için bir nihai çözüm çizgisinde bir şey daha olabilir.

<?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 Below

Bu ne peşinde çizgisinde mi?

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

Eğer ihtiyacınız ne preg_grep aslında.

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

Sonuçları

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

edit:

the user supplies the text, I add the wildcards behind the scenes. I do use one %. LIKE 'text%'

burada regex bunu belirtmek nasıl

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

Also, remember to use preg_quote on any text you get from a third party. $regex = "#" . preg_quote($text) . "#i"; $res = preg_grep($regex, $arr);

Sana preg_match gerekir düşünürdüm ama bu tam bir benzeri gibi aynı davranış değil.

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

Eğer giriş dizesi var% GİBİ olup olmadığını kontrol edebilmek istiyorum demek?

Sen% var% maç strpos (samanlık, iğne) kullanabilirsiniz.

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

Bu çok çirkin. Ve aslında muhtemelen en zarif.

Dizeleri biçimlendirilmiş nasıl bağlı olarak, sınırlayıcı ile tek bir dizede diziyi saklamak sorguları çok daha hızlı Regex ile yapabilirsiniz. Bu tür endeks takibi gibi başka amaçlar için dizi kullanmadığınız sürece.

Senin dizi {"foo", "bar"} diyelim; ve boru karakter listesinde olmamak garantilidir. Ve gibi sorgu "% r"

Sözde kodda (PHP bilmiyorum):

str = "|foo|bar|"
regexquery = "|(" + replace(likequery, "%", ".*") + ")|" 
match = regex_match(str, regexquery)