(Wildcard ile) php arama kelimesi

5 Cevap php

Bir dize bir joker koymak için bir yolu var mı? Şu anda ben iki alt dizeleri (yani "benim" ve "köpek" ile sonuçlanan, "Köpeğim pire" cümlede "pire" arasındaki içeriğini kapmak arasında bir alt dize aramak için bir işlevi var çünkü ben soruyorum neden nedeni .)

function get_string_between($string, $start, $end){ 
    $string = " ".$string; 
    $ini = strpos($string,$start); 
    if ($ini == 0) return ""; 
    $ini += strlen($start); 
    $len = strpos($string,$end,$ini) - $ini; 
    return substr($string,$ini,$len); 
} 

Ne yapmak istiyorsun dizede bir joker ile aramak zorunda olduğunu. O olurdu yine çıktı "köpek" - Ben "% joker%" ve "Benim köpek pire" cümlede "pire" arasında arama söylüyorlar.

Ben çok iyi açıkladım olmadığını bilmiyorum ama umarım birisi beni anlayacaksınız: P Okumak için çok teşekkür ederiz!

5 Cevap

Bu, düzenli ifadeler aslında yararlı olan birkaç olgudan biridir. :)

if (preg_match('/my (\w+) has/', $str, $matches)) {
    echo $matches[1];
}

preg_match için belgelerine bakın.

Regex çok daha esnek joker daha olduğunu kabul ediyorum, ama bazen istediğiniz tüm desenleri tanımlamak için basit bir yoludur. Taşınabilir bir çözüm arayan insanlar için (* NIX sadece) burada işlevi benim uygulamasıdır:

function wild_compare($wild, $string) {
    $wild_i = 0;
    $string_i = 0;

    $wild_len = strlen($wild);
    $string_len = strlen($string);

    while ($string_i < $string_len && $wild[$wild_i] != '*') {
        if (($wild[$wild_i] != $string[$string_i]) && ($wild[$wild_i] != '?')) {
            return 0;
        }
        $wild_i++;
        $string_i++;
    }

    $mp = 0;
    $cp = 0;

    while ($string_i < $string_len) {
        if ($wild[$wild_i] == '*') {
            if (++$wild_i == $wild_len) {
                return 1;
            }
            $mp = $wild_i;
            $cp = $string_i + 1;
        }
        else
        if (($wild[$wild_i] == $string[$string_i]) || ($wild[$wild_i] == '?')) {
            $wild_i++;
            $string_i++;
        }
        else {
            $wild_i = $mp;
            $string_i = $cp++;
        }
    }

    while ($wild[$wild_i] == '*') {
        $wild_i++;
    }

    return $wild_i == $wild_len ? 1 : 0;
}

Doğal PHP uygulama fnmatch () daha yavaştır, ancak herhangi bir platform üzerinde çalışacak.

Bu gibi kullanılabilir:

if (wild_compare('regex are * useful', 'regex are always useful') == 1) {
    echo "I'm glad we agree on this";
}

Bir regex kullanın.

$string = "My dog has fleas";
if (preg_match("/\S+ (\S+) has fleas/", $string, $matches))
  echo ($matches[1]);
else
  echo ("Not found");

\S olmayan herhangi bir boşluk karakteri, + böylece \S+ maç, bir veya daha fazla non-boşluk karakteri anlamına gelir, bir önceki şey bir veya daha fazla anlamındadır. (…) submatch içeriğini yakalamak ve $matches dizi içine koymak anlamına gelir.

joker desen böyle regex desen dönüştürülmüş olabilir

function wildcard_match($pattern, $subject) {
  $pattern = strtr($pattern, array(
    '*' => '.*?', // 0 or more (lazy) - asterisk (*)
    '?' => '.', // 1 character - question mark (?)
  ));
  return preg_match("/$pattern/", $subject);
}

eğer dizesinin içeriği özel karakterler, örneğin .? \ + * ^ $ | {} / '#, Onlar \-öncelenmesi gerekir

test yok:

function wildcard_match($pattern, $subject) {
  // quotemeta function has most similar behavior,
  // it escapes \.+*?^$[](), but doesn't escape |{}/'#
  // we don't include * and ?
  $special_chars = "\.+^$[]()|{}/'#";
  $special_chars = str_split($special_chars);
  $escape = array();
  foreach ($special_chars as $char) $escape[$char] = "\\$char";
  $pattern = strtr($pattern, $escape);
  $pattern = strtr($pattern, array(
    '*' => '.*?', // 0 or more (lazy) - asterisk (*)
    '?' => '.', // 1 character - question mark (?)
  ));
  return preg_match("/$pattern/", $subject);
}

If you insist to use wildcard (and yes, PREG is much better) you can use function fnmatch which works only on *NIX.

Şerefe