Bir dizenin belirli bir kelime içerip içermediğini nasıl kontrol ederim?


2661

Düşünmek:

$a = 'How are you?';

if ($a contains 'are')
    echo 'true';

Yukarıdaki kodu aldığımı varsayalım, ifadeyi yazmanın doğru yolu if ($a contains 'are')nedir?

Yanıtlar:


6892

strpos()Bir dizenin bir diğerinin içindeki oluşumunu bulmak için kullanılan işlevi kullanabilirsiniz :

$a = 'How are you?';

if (strpos($a, 'are') !== false) {
    echo 'true';
}

Kullanımının !== falsekasıtlı olduğuna dikkat edin ( istenen sonucu != falsene === truedöndürmez ne de döndürür); strpos()samanlık dizesinde iğne dizesinin başladığı ofseti veya falseiğne bulunmazsa boole değerini döndürür . 0 geçerli bir ofset ve 0 "falsey" olduğundan, gibi daha basit yapıları kullanamayız !strpos($a, 'are').


261
Partiye çok geç, ama buna dikkat et. Bu aynı zamanda 'Umurunda mı duruyorsun?'
DTest

167
@DTest - evet, tabii ki bu dize 'are' içerdiğinden true döndürecektir. Özellikle ARE kelimesini arıyorsanız, örneğin A'dan önce ve
E'den

40
Yukarıdaki çok iyi yorumlar! Asla! = Veya == kullanmam, sonuçta! == ve === en iyi seçenektir (benim görüşüme göre) tüm yönler dikkate alınır (hız, doğruluk vb.).
Melsi

10
@jsherk Neden regexes olmasın? "Var" gibi bir şey.
Giulio Muscarello

21
Ben her zaman strpos($a, 'are') > -1doğru test etmek için kullanarak bu sorunu önlemek eğilimindedir . Hata ayıklama perspektifinden bakıldığında, beynimin bitişik eşit işaretleri saymam gerekmediğinde satırın doğru yazılıp yazılmadığını belirleyen daha az saat döngüsünü boşa harcadığını görüyorum.
equazcion

608

Düzenli ifadeler kullanabilirsiniz, strposdiğer kullanıcılar tarafından belirtildiği gibi kelime eşleme için daha iyidir , ayrıca ücret, bakım, bakış, vb gibi dizeler için de doğru dönecektir. Bu, sözcük sınırlarını kullanarak normal ifadede önlenebilir.

İçin basit bir eşleşme şöyle görünebilir:

$a = 'How are you?';

if (preg_match('/\bare\b/', $a)) {
    echo 'true';
}

Performans tarafında, strposyaklaşık üç kat daha hızlı ve aklımda, bir kerede bir milyon karşılaştırma yaptığımda, preg_matchbitirmek 1.5 saniye strpossürdü ve 0.5 saniye sürdü.

Düzenleme: Sadece kelime kelime değil, dizenin herhangi bir bölümünü aramak için, gibi normal bir ifade kullanmanızı tavsiye ederim

$a = 'How are you?';
$search = 'are y';
if(preg_match("/{$search}/i", $a)) {
    echo 'true';
}

iNormal ifadenin sonunda bunu istemiyorsanız, bunu dışarı bırakabilir, büyük küçük harf duyarsız olması normal ifadeyi değiştirir.

Şimdi, bu, $ arama dizesi herhangi bir şekilde sterilize edilmediğinden, bazı durumlarda oldukça sorunlu olabilir, yani, bazı durumlarda denetimi geçmeyebilir, sanki $searchbir kullanıcı girişi gibi davranabilirler. bazı farklı düzenli ifadeler ...

Ayrıca, burada çeşitli düzenli ifadelerin açıklamalarını test etmek ve görmek için harika bir araç Regex101

Her iki işlevsellik kümesini tek bir çok amaçlı işlevde (seçilebilir büyük / küçük harf duyarlılığı dahil) birleştirmek için aşağıdaki gibi bir şey kullanabilirsiniz:

function FindString($needle,$haystack,$i,$word)
{   // $i should be "" or "i" for case insensitive
    if (strtoupper($word)=="W")
    {   // if $word is "W" then word search instead of string in string search.
        if (preg_match("/\b{$needle}\b/{$i}", $haystack)) 
        {
            return true;
        }
    }
    else
    {
        if(preg_match("/{$needle}/{$i}", $haystack)) 
        {
            return true;
        }
    }
    return false;
    // Put quotes around true and false above to return them as strings instead of as bools/ints.
}

9
@ Alexander.Plutov ikinci olarak bana bir -1 veriyorsun, soru değil mi? cmon cevabı google.com/…
Breezer

64
+1 Basit bir dize aramak için korkunç bir yol, ancak SO'ya gelen birçok ziyaretçi kendi alt dizelerinden herhangi birini aramak için herhangi bir yol arıyor ve öneri getirildi. OP bile aşırı basitleştirilmiş olabilir - alternatiflerini ona bildirin.
SamGoody

72
Teknik olarak, soru bir alt dize değil kelimelerin nasıl bulunacağını sorar . Bu aslında bana yardımcı oldu çünkü ben regex kelime sınırları ile kullanabilirsiniz. Alternatifler her zaman faydalıdır.

15
Cevap için +1 ve @ plutov.by yorumuna -1, çünkü strpos sadece tek bir çek, bu arada regexp aynı anda birçok kelimeyi kontrol edebilirsiniz ex: preg_match (/ are | you | not /)
albanx

4
Düzenli İfadeler son çare yöntemi olmalıdır. Önemsiz görevlerde kullanımları cesaret kırılmalıdır. Ben yıllarca kötü kod kazma yüksekliğinden ısrar ediyorum.
yentsun

257

İşte böyle durumlarda yararlı küçük bir yardımcı program işlevi

// returns true if $needle is a substring of $haystack
function contains($needle, $haystack)
{
    return strpos($haystack, $needle) !== false;
}

74
@RobinvanBaalen Aslında kod okunabilirliğini artırabilir. Ayrıca, aşağı oyların "nötr" olanlar için değil, (çok) kötü cevaplar için olması gerekir.
Xaqq

37
@RobinvanBaalen işlevleri okunabilirlik için tanım gereğidir (ne yaptığınız fikrini iletmek için). Daha okunabilir if ($email->contains("@") && $email->endsWith(".com)) { ...if (strpos($email, "@") !== false && substr($email, -strlen(".com")) == ".com") { ...
olanları

3
@RobinvanBaalen son kurallarında kırılmak içindir. Aksi takdirde insanlar daha yeni şeyler yapmanın yollarını bulamazlar :). Artı itiraf etmeliyim martinfowler.com gibi şeyler etrafında zihin sarma sorun var. Yapılması gereken en doğru şey, şeyleri kendiniz denemek ve hangi yaklaşımların en uygun olduğunu bulmaktır.
James P.

5
Başka bir görüş: Kolayca satabileceğiniz bir yardımcı program işlevine sahip olmak, hata ayıklamaya yardımcı olabilir. Ayrıca, üretim hizmetlerinde bu tür yükü ortadan kaldıran iyi optimize ediciler için ağlamayı gevşetir. Dolayısıyla tüm görüşlerin geçerli noktaları vardır. ;)
Tino

18
Tabii ki bu yararlı. Bunu teşvik etmelisin. PHP 100'de dize konumları bulmanın yeni ve daha hızlı bir yolu varsa ne olur? Strpos adını verdiğiniz tüm yerlerinizi değiştirmek ister misiniz? Yoksa sadece işlev içindeki içerir değiştirmek istiyor musunuz ??
Cosmin

143

Bu cevapların çoğu dizenizde bir alt dize belirip belirmediğini size söylese de, genellikle bir alt dize değil, belirli bir kelimeyi arıyorsanız istediğiniz şey değildir .

Fark ne? Alt dizeler başka kelimelerle de görünebilir:

  • "Alan" ın başında "vardır"
  • "Tavşan" ın sonunda "vardır"
  • "Ücretler" ortasında "vardır"

Bunu hafifletmenin bir yolu, kelime sınırları ( \b) ile birlikte düzenli bir ifade kullanmaktır :

function containsWord($str, $word)
{
    return !!preg_match('#\\b' . preg_quote($word, '#') . '\\b#i', $str);
}

Bu yöntem, yukarıda belirtilen aynı yanlış pozitiflere sahip değildir, ancak kendi uç durumlarına sahiptir. Sözcük sınırları olmayan kelime karakterler (eşleştirilecek \Wdeğil bir şey olacak), a-z, A-Z, 0-9, veya _. Bu, rakamların ve alt çizgilerin kelime karakterleri olarak sayılacağı ve bunun gibi senaryoların başarısız olacağı anlamına gelir:

  • "Ne düşünüyorsun?"
  • "Are" içinde "lol u dunno wut bu are4?"

Bundan daha doğru bir şey istiyorsanız, İngilizce sözdizimi ayrıştırma yapmaya başlamanız gerekir ve bu oldukça büyük bir solucan kutusu (ve her zaman verilen bir sözdiziminin düzgün kullanılmadığını varsayar).


24
bu kanonik cevap olmalı. Alt dizeleri değil kelimeleri arıyoruz , normal ifade uygun. Ben de ekleyeceğiz eşleşir iki şey bulmak için büyük yapar yapmaz kelimeleri bir dizede: Bu dizenin başında maçları ( ) ve dize (sonu )\b\W^$
code_monk

bu doğru cevap olmalı .. cevapların geri kalanı "umursuyor musunuz" gibi bir dize içinde "vardır" bulacaksınız .. @ Dtest tarafından belirtildiği gibi
Robert Sinclair

@RobertSinclair Çok mu kötü? Bana "umursuyor musunuz" dizesinin "are" kelimesini içerip içermediğini sorduysanız "yes" diyorum. "Are" kelimesi açıkça bu dizenin bir alt dizesidir. Bu "" "dan ayrı bir soru," "umursuyor musunuz" "" dizesindeki kelimelerden biridir.
Paul

@Paulpro Etkinlik rağmen $ a bir cümle belirtmediyse de, bunun ima edildiğinden eminim. Yani sorusu, Cümlenin içindeki Sözü nasıl tespit edeceğiydi. Bir Word içinde bir Kelime içeriyorsa, daha sık ilgisiz olacağını varsayacağım.
Robert Sinclair

@Jimbo işe yarıyor, `` 3v4l.org/ZRpYi
MetalWeirdo

125

Bir dizenin başka bir dizgi içerip içermediğini belirlemek için PHP işlev strpos () işlevini kullanabilirsiniz .

int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )

<?php

$haystack = 'how are you';
$needle = 'are';

if (strpos($haystack,$needle) !== false) {
    echo "$haystack contains $needle";
}

?>

DİKKAT:

Aradığınız iğne samanlığın başlangıcındaysa, 0 konumuna dönecektir, eğer işe yaramayacak bir ==karşılaştırma yaparsanız,===

Bir ==işaret bir karşılaştırmadır ve soldaki değişken / ifade / sabitin sağdaki değişken / ifade / sabitle aynı değere sahip olup olmadığını test eder.

Bir ===işaret, iki değişkenin / ifadenin / sabitin eşit olup olmadığını görmek için bir karşılaştırmadır AND- yani her ikisi de dize veya her ikisi de tamsayıdır.


67

Şuna bakstrpos() :

<?php
    $mystring = 'abc';
    $findme   = 'a';
    $pos = strpos($mystring, $findme);

    // Note our use of ===. Simply, == would not work as expected
    // because the position of 'a' was the 0th (first) character.
    if ($pos === false) {
        echo "The string '$findme' was not found in the string '$mystring'.";
    }
    else {
        echo "The string '$findme' was found in the string '$mystring',";
        echo " and exists at position $pos.";
    }
?>

62

Kullanılması strstr()veya stristr()arama olmalıdır eğer durum duyarsız başka bir seçenek olacaktır.


9
Php.net/manual/tr/function.strstr.php sayfasında bir not : Not: Yalnızca samanlıkta belirli bir iğnenin olup olmadığını belirlemek istiyorsanız, bunun yerine daha hızlı ve daha az bellek yoğun işlev strpos () kullanın.
Jo Smo

@tastro Bu konuda saygın bir kriter var mı?
Wayne Whitty

Bu daha yavaş olabilir, ancak IMHO strstr($a, 'are')çirkin olandan çok daha zariftir strpos($a, 'are') !== false. PHP gerçekten bir str_contains()işleve ihtiyaç duyar .
Paul Spiegel

Bunun kabul edilen cevap olmadığını aklımdan alıyor
kurdtpage

45

Büyük / küçük harf duyarsız eşleştirmeyi kullanarak stripos()şunları kullanın :

if (stripos($string,$stringToSearch) !== false) {
    echo 'true';
}

45

SamGoody ve Lego Stormtroopr'a göz atın.

Birden fazla kelimenin yakınlığına / alaka düzeyine göre arama sonuçlarını sıralamak için bir PHP algoritması arıyorsanız, burada sadece PHP ile arama sonuçları oluşturmanın hızlı ve kolay bir yolu gelir:

Diğer boolean arama yöntemleriyle ilgili sorunlar gibi strpos(), preg_match(), strstr()veyastristr()

  1. birden fazla kelime arayamıyorum
  2. sonuçlar doğrulanmamış

Vector Space Modeli ve tf-idf (terim sıklığı - ters belge sıklığı) tabanlı PHP yöntemi :

Kulağa zor geliyor ama şaşırtıcı derecede kolay.

Bir dizede birden fazla kelime aramak istiyorsak, temel sorun, her birine nasıl ağırlık atadığımızdır?

Bir dizedeki terimleri bir bütün olarak dizenin temsilcisine göre ağırlıklandırabiliyorsak, sonuçlarımızı sorguyla en iyi eşleşenlere göre sıralayabiliriz.

Bu, SQL tam metin aramasının nasıl çalıştığından çok uzak olmayan vektör uzay modeli fikridir :

function get_corpus_index($corpus = array(), $separator=' ') {

    $dictionary = array();

    $doc_count = array();

    foreach($corpus as $doc_id => $doc) {

        $terms = explode($separator, $doc);

        $doc_count[$doc_id] = count($terms);

        // tf–idf, short for term frequency–inverse document frequency, 
        // according to wikipedia is a numerical statistic that is intended to reflect 
        // how important a word is to a document in a corpus

        foreach($terms as $term) {

            if(!isset($dictionary[$term])) {

                $dictionary[$term] = array('document_frequency' => 0, 'postings' => array());
            }
            if(!isset($dictionary[$term]['postings'][$doc_id])) {

                $dictionary[$term]['document_frequency']++;

                $dictionary[$term]['postings'][$doc_id] = array('term_frequency' => 0);
            }

            $dictionary[$term]['postings'][$doc_id]['term_frequency']++;
        }

        //from http://phpir.com/simple-search-the-vector-space-model/

    }

    return array('doc_count' => $doc_count, 'dictionary' => $dictionary);
}

function get_similar_documents($query='', $corpus=array(), $separator=' '){

    $similar_documents=array();

    if($query!=''&&!empty($corpus)){

        $words=explode($separator,$query);

        $corpus=get_corpus_index($corpus, $separator);

        $doc_count=count($corpus['doc_count']);

        foreach($words as $word) {

            if(isset($corpus['dictionary'][$word])){

                $entry = $corpus['dictionary'][$word];


                foreach($entry['postings'] as $doc_id => $posting) {

                    //get term frequency–inverse document frequency
                    $score=$posting['term_frequency'] * log($doc_count + 1 / $entry['document_frequency'] + 1, 2);

                    if(isset($similar_documents[$doc_id])){

                        $similar_documents[$doc_id]+=$score;

                    }
                    else{

                        $similar_documents[$doc_id]=$score;

                    }
                }
            }
        }

        // length normalise
        foreach($similar_documents as $doc_id => $score) {

            $similar_documents[$doc_id] = $score/$corpus['doc_count'][$doc_id];

        }

        // sort from  high to low

        arsort($similar_documents);

    }   

    return $similar_documents;
}

DAVA 1

$query = 'are';

$corpus = array(
    1 => 'How are you?',
);

$match_results=get_similar_documents($query,$corpus);
echo '<pre>';
    print_r($match_results);
echo '</pre>';

SONUÇ

Array
(
    [1] => 0.52832083357372
)

DURUM 2

$query = 'are';

$corpus = array(
    1 => 'how are you today?',
    2 => 'how do you do',
    3 => 'here you are! how are you? Are we done yet?'
);

$match_results=get_similar_documents($query,$corpus);
echo '<pre>';
    print_r($match_results);
echo '</pre>';

SONUÇLAR

Array
(
    [1] => 0.54248125036058
    [3] => 0.21699250014423
)

DURUM 3

$query = 'we are done';

$corpus = array(
    1 => 'how are you today?',
    2 => 'how do you do',
    3 => 'here you are! how are you? Are we done yet?'
);

$match_results=get_similar_documents($query,$corpus);
echo '<pre>';
    print_r($match_results);
echo '</pre>';

SONUÇLAR

Array
(
    [3] => 0.6813781191217
    [1] => 0.54248125036058
)

Orada yapılacak iyileştirmelerin bol ama modeli gibi bağlaçlar yok doğal sorgular, iyi sonuçlar almanın bir yol sağlar strpos(), preg_match(), strstr()veya stristr().

NOTA BENE

İsteğe bağlı olarak, kelimeleri aramadan önce artıklığı ortadan kaldırma

  • böylece dizin boyutunu azaltır ve daha az depolama gereksinimi sağlar

  • daha az disk G / Ç

  • daha hızlı indeksleme ve sonuç olarak daha hızlı bir arama.

1. Normalleştirme

  • Tüm metni küçük harfe dönüştür

2. Engellenecek kelime eliminasyonu

  • Gerçek anlam taşımayan metindeki kelimeleri ortadan kaldırın ('ve', 'veya', '', 'için' vb.)

3. Sözlük değiştirme

  • Kelimeleri aynı veya benzer bir anlama sahip başkalarıyla değiştirin. (ör: 'aç' ve 'aç' örneklerini 'açlık' ile değiştir)

  • Kelimeleri temel anlamlarına daha da azaltmak için başka algoritmik önlemler (kartopu) yapılabilir.

  • Renk adlarının onaltılık eşdeğerleriyle değiştirilmesi

  • Hassasiyeti azaltarak sayısal değerlerin azaltılması, metni normalleştirmenin diğer yoludur.

KAYNAKLAR


40

"Falsey" ve "doğruluk" sorunlarından kaçınmak istiyorsanız, substr_count komutunu kullanabilirsiniz:

if (substr_count($a, 'are') > 0) {
    echo "at least one 'are' is present!";
}

Strpos'tan biraz daha yavaş ama karşılaştırma problemlerinden kaçınıyor.


Bu döndürür falseiçin "Emin misiniz?" için pozisyon beri strposolduğu0
Hafenkranich

30

Başka bir seçenek strstr () işlevini kullanmaktır. Gibi bir şey:

if (strlen(strstr($haystack,$needle))>0) {
// Needle Found
}

Dikkat edilmesi gereken nokta: strstr () işlevi büyük / küçük harfe duyarlıdır. Büyük / küçük harfe duyarlı olmayan bir arama için stristr () işlevini kullanın.


1
İğne bulunamazsa strstr () işlevi FALSE değerini döndürür. Bu yüzden bir strlen gerekli değildir.
Ayesh K

29
if (preg_match('/(are)/', $a)) {
   echo 'true';
}

3
Aşağıdaki uyarıyı alıyorum:WARNING preg_match(): Delimiter must not be alphanumeric or backslash
Pathros

27

Biraz kullanılan burada cevapları hiçbirinin etkiledi değilim strpos, strstrve benzeri fonksiyonlar söz baytlı Dizge İşlevleri henüz (2015-05-08).

Temel olarak, Almanca, Fransızca, Portekizce, İspanyolca vb. Gibi bazı dillere özgü karakterleri olan kelimeleri bulmakta sorun yaşıyorsanız (örn: ä , é , ô , ç , º , ñ ), ile fonksiyonları mb_. Bu nedenle, kabul edilen cevap bunun yerine mb_strposveya mb_stripos(büyük / küçük harf duyarsız eşleme için) kullanır:

if (mb_strpos($a,'are') !== false) {
    echo 'true';
}

UTF-8'de tüm verilerinizin% 100 olduğunu garanti edemezseniz , mb_işlevleri kullanmak isteyebilirsiniz .

İyi bir makale olduğunu anlamak Mutlak Asgari Her Yazılım Geliştirici Kesinlikle, Olumlu Unicode ve Karakter Kümeleri (No Bahane!) Hakkında bilmeniz gereken tarafından Joel Spolsky .


25

PHP'de, bir dizenin belirli bir alt dize içerip içermediğini doğrulamanın en iyi yolu, aşağıdaki gibi basit bir yardımcı işlev kullanmaktır:

function contains($haystack, $needle, $caseSensitive = false) {
    return $caseSensitive ?
            (strpos($haystack, $needle) === FALSE ? FALSE : TRUE):
            (stripos($haystack, $needle) === FALSE ? FALSE : TRUE);
}

Açıklama:

  • strpos bir dizedeki büyük / küçük harfe duyarlı bir alt dize oluşumunun konumunu bulur.
  • stripos dizede büyük / küçük harfe duyarlı olmayan bir alt dizenin ilk oluşumunun konumunu bulur.
  • myFunction($haystack, $needle) === FALSE ? FALSE : TRUEolmasını sağlar myFunctionalt dize endeksi 0 olduğunda her zaman bir boolean ve düzeltmeler beklenmeyen davranışlar döndürür.
  • $caseSensitive ? A : Bdeğerine bağlı olarak strposveya striposişi yapmak için seçim yapar $caseSensitive.

Çıktı:

var_dump(contains('bare','are'));            // Outputs: bool(true)
var_dump(contains('stare', 'are'));          // Outputs: bool(true)
var_dump(contains('stare', 'Are'));          // Outputs: bool(true)
var_dump(contains('stare', 'Are', true));    // Outputs: bool(false)
var_dump(contains('hair', 'are'));           // Outputs: bool(false)
var_dump(contains('aren\'t', 'are'));        // Outputs: bool(true)
var_dump(contains('Aren\'t', 'are'));        // Outputs: bool(true)
var_dump(contains('Aren\'t', 'are', true));  // Outputs: bool(false)
var_dump(contains('aren\'t', 'Are'));        // Outputs: bool(true)
var_dump(contains('aren\'t', 'Are', true));  // Outputs: bool(false)
var_dump(contains('broad', 'are'));          // Outputs: bool(false)
var_dump(contains('border', 'are'));         // Outputs: bool(false)

22

Aşağıdaki işlev de çalışır ve başka herhangi bir işleve bağlı değildir; yalnızca yerel PHP dize manipülasyonu kullanır. Şahsen, bunu önermiyorum, ancak nasıl çalıştığını görebilirsiniz:

<?php

if (!function_exists('is_str_contain')) {
  function is_str_contain($string, $keyword)
  {
    if (empty($string) || empty($keyword)) return false;
    $keyword_first_char = $keyword[0];
    $keyword_length = strlen($keyword);
    $string_length = strlen($string);

    // case 1
    if ($string_length < $keyword_length) return false;

    // case 2
    if ($string_length == $keyword_length) {
      if ($string == $keyword) return true;
      else return false;
    }

    // case 3
    if ($keyword_length == 1) {
      for ($i = 0; $i < $string_length; $i++) {

        // Check if keyword's first char == string's first char
        if ($keyword_first_char == $string[$i]) {
          return true;
        }
      }
    }

    // case 4
    if ($keyword_length > 1) {
      for ($i = 0; $i < $string_length; $i++) {
        /*
        the remaining part of the string is equal or greater than the keyword
        */
        if (($string_length + 1 - $i) >= $keyword_length) {

          // Check if keyword's first char == string's first char
          if ($keyword_first_char == $string[$i]) {
            $match = 1;
            for ($j = 1; $j < $keyword_length; $j++) {
              if (($i + $j < $string_length) && $keyword[$j] == $string[$i + $j]) {
                $match++;
              }
              else {
                return false;
              }
            }

            if ($match == $keyword_length) {
              return true;
            }

            // end if first match found
          }

          // end if remaining part
        }
        else {
          return false;
        }

        // end for loop
      }

      // end case4
    }

    return false;
  }
}

Ölçek:

var_dump(is_str_contain("test", "t")); //true
var_dump(is_str_contain("test", "")); //false
var_dump(is_str_contain("test", "test")); //true
var_dump(is_str_contain("test", "testa")); //flase
var_dump(is_str_contain("a----z", "a")); //true
var_dump(is_str_contain("a----z", "z")); //true 
var_dump(is_str_contain("mystringss", "strings")); //true 

13
Bana strpos mükemmel uygulanabilir bir çözüm olduğunda, neden dünyada böyle bir işlevi kullanacağınızı söyler misiniz? ...
sg3s

3
@ sg3s: tamamen haklısınız, ancak strpos da böyle bir şeye dayanıyor, ayrıca, sadece biraz bilgi paylaşmak için temsilci için yayınlamadım
Jason OOO

son var_dump yanlış
Güneşli

1
@Sunny: yazım hatasıydı: var_dump (is_str_contain ("mystringss", "strings")); // doğru
Jason OOO

22

strstrİşlevi kullanabilirsiniz :

$haystack = "I know programming";
$needle   = "know";
$flag = strstr($haystack, $needle);

if ($flag){

    echo "true";
}

Dahili bir fonksiyon kullanmadan:

$haystack  = "hello world";
$needle = "llo";

$i = $j = 0;

while (isset($needle[$i])) {
    while (isset($haystack[$j]) && ($needle[$i] != $haystack[$j])) {
        $j++;
        $i = 0;
    }
    if (!isset($haystack[$j])) {
        break;
    }
    $i++;
    $j++;

}
if (!isset($needle[$i])) {
    echo "YES";
}
else{
    echo "NO ";
}

2
İlk kelimeyi ararsanız çöker .
T30

20

Bununla ilgili bir sorunum vardı ve sonunda kendi çözümümü oluşturmayı seçtim. Kullanmadan düzenli ifade motoru:

function contains($text, $word)
{
    $found = false;
    $spaceArray = explode(' ', $text);

    $nonBreakingSpaceArray = explode(chr(160), $text);

    if (in_array($word, $spaceArray) ||
        in_array($word, $nonBreakingSpaceArray)
       ) {

        $found = true;
    }
    return $found;
 }

Önceki çözümlerin, bir başkası için önek olarak kullanılan kelimenin cevabı olmadığını fark edebilirsiniz. Örneğinizi kullanmak için:

$a = 'How are you?';
$b = "a skirt that flares from the waist";
$c = "are";

Yukarıdaki örneklerin ile hem $ave $biçerdiği $c, ancak işlevi yalnızca söylemek isteyebilir $aiçeren $c.


1
muhtemelen demek $found = false
istediniz

1
sözcük virgül, soru işareti veya nokta ile bağlantılıysa işleviniz çalışmayabilir. örneğin "ne görürsen onu alırsın." ve "get" in cümle içerisinde olup olmadığını belirlemek istiyorsunuz. "Alma" nın yanındaki durağa dikkat edin. Bu durumda, işleviniz false değerini döndürür. dizeleri aramak / değiştirmek için normal ifade veya substr (yine de normal ifade kullandığını düşünüyorum) kullanılması önerilir.
lightbringer

@lightbringer tavsiyenizle daha fazla yanlış olamazdınız, sizin için "tavsiye edilir" ne anlama geliyor? tavsiye eden veya onaylayan hiçbir yüce kişi yoktur. Bu, dilin kendisinde bir kara delik olan php'de normal ifade motorunun kullanımı ile ilgilidir, bir döngüde bir normal ifade eşleştirmeyi ve sonuçları karşılaştırmayı deneyebilirsiniz.
Decebal

Bu cevap zayıf bir şekilde gösterilmektedir ve birçok genişletilmiş senaryoda başarısız olmaktadır. Bu tekniği eğlendirmenin hiçbir faydasını görmüyorum. İşte rafine edilmiş özel fonksiyon ve yinelenen çağrı: 3v4l.org/E9dfD Araştırmacıların zamanını boşa harcadığım için bu wiki'yi düzenlemekle ilgilenmiyorum.
mickmackusa

18

Bir dizeden strstr () ve stristr () kullanarak bir kelimenin bulunmasını bulmak için başka bir seçenek de şöyledir:

<?php
    $a = 'How are you?';
    if (strstr($a,'are'))  // Case sensitive
        echo 'true';
    if (stristr($a,'are'))  // Case insensitive
        echo 'true';
?>

Bu geriye dönük. iİçinde stristrduyarsız kısaltmasıdır.
Adam Merrifield

18

substr_countSonucun kullanılıp kullanılmadığını kontrol eden birçok yanıt >0. Ancak ififade, sıfırı yanlışla aynı kabul ettiğinden, bu denetimi ve yazmayı doğrudan önleyebilirsiniz:

if (substr_count($a, 'are')) {

Mevcut olup olmadığını kontrol etmek için !operatörü ekleyin :

if (!substr_count($a, 'are')) {

Şey ... kısmen doğru,
php'de

17

Üç farklı şekilde yapılabilir:

 $a = 'How are you?';

1- stristr ()

 if (strlen(stristr($a,"are"))>0) {
    echo "true"; // are Found
 } 

2- strpos ()

 if (strpos($a, "are") !== false) {
   echo "true"; // are Found
 }

3- preg_match ()

 if( preg_match("are",$a) === 1) {
   echo "true"; // are Found
 }

Bunu 3. yılında === 1 için test edilmelidir 0'a return false veya çünkü iyi, ama preg_match risklidir
Shapeshifter

14

Kısa el versiyonu

$result = false!==strpos($a, 'are');

5
Bu kod snippet'i soruyu çözebilir, ancak bir açıklama da dahil olmak üzere , yayınınızın kalitesini artırmaya yardımcı olur. Gelecekte okuyucular için soruyu cevapladığınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceğini unutmayın.
Bono

14

Bir 'kelime' bulmak için, aslında başka bir kelimenin bir parçası olabilecek bir dizi harfin ortaya çıkmasından ziyade, aşağıdakiler iyi bir çözüm olacaktır.

$string = 'How are you?';
$array = explode(" ", $string);

if (in_array('are', $array) ) {
    echo 'Found the word';
}

5
başarısız eğer $stringisAre are, are?
Güneşli

13

Büyük / küçük harf duyarsız biçimi kullanmalısınız, bu nedenle girilen değer içerideyse smallveya capsönemli değilse .

<?php
$grass = "This is pratik joshi";
$needle = "pratik";
if (stripos($grass,$needle) !== false) { 

 /*If i EXCLUDE : !== false then if string is found at 0th location, 
   still it will say STRING NOT FOUND as it will return '0' and it      
   will goto else and will say NOT Found though it is found at 0th location.*/
    echo 'Contains word';
}else{
    echo "does NOT contain word";
}
?>

Burada stripos buluntular heystack içinde iğne olmayan durumda (küçük / kapakları) göz önüne alındığında.

Çıkışlı PHPCode Örneği


13

Belki böyle bir şey kullanabilirsiniz:

<?php
    findWord('Test all OK');

    function findWord($text) {
        if (strstr($text, 'ok')) {
            echo 'Found a word';
        }
        else
        {
            echo 'Did not find a word';
        }
    }
?>

12

preg_match()Yalnızca bir dizenin başka bir dizede bulunup bulunmadığını kontrol etmek istiyorsanız kullanmayın . Daha hızlı olacağı için strpos()veya strstr()yerine kullanın . ( http://in2.php.net/preg_match )

if (strpos($text, 'string_name') !== false){
   echo 'get the string';
}

12

Dizenin birkaç spesifik kelime içerip içermediğini kontrol etmek istiyorsanız, şunları yapabilirsiniz:

$badWords = array("dette", "capitale", "rembourser", "ivoire", "mandat");

$string = "a string with the word ivoire";

$matchFound = preg_match_all("/\b(" . implode($badWords,"|") . ")\b/i", $string, $matches);

if ($matchFound) {
    echo "a bad word has been found";
}
else {
    echo "your string is okay";
}

Bu, örneğin e-posta gönderirken spam'ı önlemek için kullanışlıdır.


10

Strpos işlevi iyi çalışır, ancak case-insensitivebir paragrafta bir sözcüğü denetlemek istiyorsanız, striposişlevini kullanabilirsiniz PHP.

Örneğin,

$result = stripos("I love PHP, I love PHP too!", "php");
if ($result === false) {
    // Word does not exist
}
else {
    // Word exists
}

Bir dizede büyük / küçük harfe duyarlı olmayan bir alt dizenin ilk oluşumunun konumunu bulun.

Sözcük dizede yoksa, yanlış döndürür, başka bir deyişle kelimenin konumunu döndürür.


9

Özdeş / özdeş olmayan işleçler kullanmanız gerekir, çünkü strpos dizin değeri olarak 0 döndürebilir. Üçlü operatörleri seviyorsanız, aşağıdakileri kullanmayı düşünün (itiraf edeceğim biraz geriye doğru görünüyor):

echo FALSE === strpos($a,'are') ? 'false': 'true';

8

Dizenin belirli kelimeler içerip içermediğini kontrol ettiniz mi?

Bu, dizenin kelimelere çözülmesi gerektiği anlamına gelir (aşağıdaki nota bakın).

Bunu yapmanın ve ayırıcıları belirtmenin bir yolu preg_split( doc ) kullanmaktır:

<?php

function contains_word($str, $word) {
  // split string into words
  // separators are substrings of at least one non-word character
  $arr = preg_split('/\W+/', $str, NULL, PREG_SPLIT_NO_EMPTY);

  // now the words can be examined each
  foreach ($arr as $value) {
    if ($value === $word) {
      return true;
    }
  }
  return false;
}

function test($str, $word) {
  if (contains_word($str, $word)) {
    echo "string '" . $str . "' contains word '" . $word . "'\n";
  } else {
    echo "string '" . $str . "' does not contain word '" . $word . "'\n" ;
  }
}

$a = 'How are you?';

test($a, 'are');
test($a, 'ar');
test($a, 'hare');

?>

Bir koşu verir

$ php -f test.php                   
string 'How are you?' contains word 'are' 
string 'How are you?' does not contain word 'ar'
string 'How are you?' does not contain word 'hare'

Not: Burada her sembol dizisi için bir kelime kastetmiyoruz.

Kelimenin pratik bir tanımı, PCRE düzenli ifade motorunun, kelimelerin sadece sözcük karakterlerinden oluşan alt dizeler olduğu ve sözcük olmayan karakterlerle ayrıldığı anlamındadır.

Bir "kelime" karakteri herhangi bir harf ya da rakam ya da alt çizgi karakteri, yani Perl kelimesinin bir parçası olabilecek herhangi bir karakterdir. Harflerin ve rakamların tanımı PCRE'nin karakter tabloları tarafından kontrol edilir ve yerel ayara özel eşleştirme gerçekleşiyorsa değişebilir (..)


7

Belirli bir dize için başka bir çözüm:

$subject = 'How are you?';
$pattern = '/are/';
preg_match($pattern, $subject, $match);
if ($match[0] == 'are') {
    echo true;
}

Ayrıca strpos()işlevi kullanabilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.