web-gelistirme-sc.com

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

Düşünmek:

$a = 'How are you?';

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

Yukarıdaki kodun bende olduğunu varsayalım, if ($a contains 'are') ifadesini yazmanın doğru yolu nedir?

2666
Charles Yeung

Bir dizgenin bir diğerinin içinde geçtiğini bulmak için kullanılan strpos() işlevini kullanabilirsiniz:

$a = 'How are you?';

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

!== false kullanımının kasıtlı olduğuna dikkat edin; strpos() ya, iğne dizesinin samanlık dizesinde başladığı yeri ya da iğne bulunmazsa, boolean false değerini döndürür. 0 geçerli bir ofset ve 0 "falsey" olduğundan, !strpos($a, 'are') gibi daha basit yapılar kullanamayız.

6129
codaddict

Düzenli ifadeler kullanabilirsiniz, diğer kullanıcılar tarafından belirtildiği gibi strpos ile karşılaştırıldığında Word eşleştirmesi için daha iyidir, ücret, dikkat, bakış vb. Gibi dizeler için de doğru olur. Bu, Word ifadeleri kullanılarak yapılan normal ifadelerden kaçınılabilir.

Bunun için basit bir eşleşme şuna benzeyebilir:

$a = 'How are you?';

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

Performans tarafında, strpos yaklaşık üç kat daha hızlı ve aklımda, bir milyonu bir seferde karşılaştırdığımda bitirmek preg_match 1.5 saniye sürdü ve strpos için 0,5 saniye sürdü.

Düzenleme: Dizenin herhangi bir bölümünü aramak için, yalnızca Word'e göre değil, düzenli bir ifade kullanmanız önerilir.

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

Düzenli ifadenin sonundaki i, normal ifadeyi büyük/küçük harf duyarlı olarak değiştirir, eğer istemezseniz, dışarıda bırakabilirsiniz.

Şimdi, $ search string herhangi bir şekilde sterilize edilmediğinden bazı durumlarda bu oldukça problemli olabilir, demek istediğim, sanki $search bir kullanıcı girişiymiş gibi bazı durumlarda check-pass yapamayabilir. Bazı farklı düzenli ifadeler gibi ...

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şlev 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.
}
528
Breezer

İşte bu gibi durumlarda yararlı olan küçük bir yardımcı fonksiyon

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

Bu yanıtların çoğu, dizginizde bir alt dizginin görünüp görünmediğini size söylese de, belirli bir Word ve a substring ifadesini arıyorsanız genellikle istediğiniz şey değildir.

Fark ne? Alt kelimeler başka bir deyişle görünebilir:

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

Bunu hafifletmenin bir yolu, Word sınırları (\b) ile birleştirilmiş düzenli 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 Edge vakalarına sahiptir. Word sınırları, \W, a-z, A-Z veya 0-9 olmayan bir şey olacak olan Word olmayan karakterlerle (_) eşleşir. Bu, rakamların ve alt çizgilerin Word karakterleri olarak sayılacağı ve bunun gibi senaryoların başarısız olacağı anlamına gelir:

  • "Ne" düşünüyorsun?
  • "Bunlar" içinde "lol u dunno wut bu olanlar 4?"

Bundan daha doğru bir şey istiyorsanız, İngilizce dili sözdizimi ayrıştırma işlemine başlamak zorunda kalacaksınız ve bu oldukça büyük bir solucan kutusu olabilir (ve yine de her zaman verilemeyen sözdiziminin uygun bir şekilde kullanıldığını varsayar).

128
FtDRbwLXw6

Bir dizenin başka bir dize içerip içermediğini belirlemek için PHP function strpos () 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:

Eğer aradığınız iğne samanlık başlangıcında ise 0 pozisyonuna dönecektir, işe yaramayacak bir == karşılaştırması yaparsanız, === yapmanız gerekir.

Bir == işareti bir karşılaştırmadır ve sola değişken/ifade/sabitin sağdaki değişken/ifade/sabit ile aynı değerde olup olmadığını test eder.

Bir === işareti, iki değişken/ifade/sabitin eşit olup olmadığını görmek için bir karşılaştırmadır. ANDaynı tiptedir - yani her ikisi de dizgedir veya her ikisi de tamsayıdır.

109
Jose Vega

Şuna bak strpos() :

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

strstr() veya stristr() kullanarak, aramanız büyük/küçük harf duyarlı değilse, başka bir seçenek olacaktır.

58
glutorange

stripos() kullanarak case-insensitive eşleştirmeden yararlanın:

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

"Falsey" ve "truthy" probleminden 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.

40
Alan Piralla

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

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

Not: strstr () işlevi büyük/küçük harf duyarlıdır. Büyük/küçük harf duyarlı bir arama için, stristr () işlevini kullanın.

31
YashG99

Burada, burada strpos, strstr ve benzer işlevler kullanan cevapların hiçbirinin Multibyte String Functions henüz (2015-05-08) bahsettiğinden çok etkilendim.

Temel olarak, eğer bazı dillere özgü karakterleri olan kelimeleri bulmakta güçlük çekiyorsanız, örneğin Almanca, Fransızca, Portekizce, İspanyolca, vb. (Örneğin: ä, é, ô, ç, º, ñ), mb_ ile işlevlerin önüne geçmek isteyebilirsiniz.Bu nedenle, kabul edilen cevap mb_strpos veya mb_stripos (bunun yerine büyük küçük harf duyarlılığı için):

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

UTF-8’de tüm verileriniz% 100’dür olduğunu garanti edemezseniz, mb_ işlevlerini kullanmak isteyebilirsiniz.

Nedenini anlamak için iyi bir makale Her Yazılım Geliştiricisinin Mutlak Minimum Değeri Unicode ve Karakter Kümelerini Kesinlikle, Olumlu Bilmeli (Mazeret Yok!) - Joel Spolsky.

28
Armfoot
if (preg_match('/(are)/', $a)) {
   echo 'true';
}
28
joan16v

Aşağıdaki işlev de çalışır ve başka hiçbir işleve bağlı değildir; yalnızca yerel PHP dize işlemini kullanır. Şahsen, bunu önermiyorum ama 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 
23
Jason OOO

PHP'de, bir dizginin belirli bir alt dize içerdiğini doğrulamanın en iyi yolu, şunun 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 /, büyük/küçük harfe duyarlı bir alt dizenin ilk bulunduğu yerin bir dizede konumunu bulur.
  • stripos / bir büyük/küçük harfe duyarlı alt dizenin ilk bulunduğu yerin bir dizede konumunu bulur.
  • myFunction($haystack, $needle) === FALSE ? FALSE : TRUE, myFunction öğesinin her zaman bir boolean döndürmesini ve alt dizinin dizini 0 olduğunda beklenmedik davranışı düzeltirmesini sağlar.
  • $caseSensitive ? A : B, $caseSensitive değerine bağlı olarak, işi yapmak için strpos veya stripos öğesini seçer.

Çı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
John Slegers

strstr işlevini kullanabilirsiniz:

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

if ($flag){

    echo "true";
}

Dahili bir işlev 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 ";
}
21
Arshid KV

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

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 diğeri için ön ek olarak kullanılan Word'ün bir 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 örneklerle, hem $a hem de $b$c içeriyor, ancak işlevinizin size yalnızca $a$c içerdiğini söylemesini isteyebilirsiniz.

21
Decebal

strstr () ve stristr () komutunu kullanarak bir dizgede bir Word oluşumunu bulmak için başka bir seçenek aşağıdaki gibidir:

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

Bir 'Kelime' bulmak için, aslında başka bir Kelime'nin parçası olabilecek bir dizi harfin ortaya çıkması yerine, 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';
}
14
DJC

Üç 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
 }
14
Shashank Singh

Kısa el versiyonu

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

Case Insensitive formatını kullanmalısınız, bu nedenle girilen değer small veya caps ise, farketmez.

<?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 heystack içinde iğne bulur olmadan dikkate al (küçük/büyük harf).

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

13
Pratik C Joshi

substr_count kullanan birçok cevap, sonucun >0 olup olmadığını kontrol eder. Ancak if deyimi, false ile aynı değerini sıfır bulduğundan, bu çekekten kaçınabilir ve doğrudan yazabilirsiniz:

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

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

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

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
Mathias Stavrou

preg_match() işlevini yalnızca bir dizginin başka bir dizgide bulunup bulunmadığını kontrol etmek istiyorsanız kullanmayın. Daha hızlı olmaları için strpos() veya strstr() işlevlerini kullanın. ( http://in2.php.net/preg_match )

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

Dize birkaç özel sözcük 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'i önlemek için kullanışlıdır.

10
Julien

Özdeş/özdeş olmayan operatörler kullanmanız gerekir, çünkü strpos, dizin değeri olarak 0 döndürür. Üçlü operatörlerden hoşlanıyorsanız, aşağıdakileri kullanmayı düşünün (biraz geriye doğru görünüyor) kabul ediyorum:

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

Strpos işlevi iyi çalışır, ancak paragrafta bir Word için case-insensitive denetimi yapmak istiyorsanız, striposPHP işlevinden yararlanabilirsiniz.

Örneğin,

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

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

Sözcük dizgede bulunmuyorsa, false değerini döndürür, başka bir deyişle Word'ün konumunu döndürür.

9
Akshay Khale

Dize belirli kelimeler içeriyor mu kontrol edin?

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

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');

?>

Koşmak 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 sırası için Word'ü kastetmiyoruz.

Word'ün pratik bir tanımı, PCRE'nin normal ifade motoru anlamına gelir; burada kelimeler, yalnızca Word karakterlerinden oluşan alt kelimelerdir, Word olmayan karakterlerle ayrılır.

Bir "Word" karakteri, herhangi bir harf veya rakam veya alt çizgi karakteri, yani bir Perl "Word" in parçası olabilecek herhangi bir karakterdir. Harflerin ve rakamların tanımı PCRE'nin karakter tabloları tarafından kontrol edilir ve yerel ayarlara uygun eşleşme gerçekleşiyorsa değişebilir (..).

8
mvw

Bir dizge aşağıdaki işlevle kontrol edilebilir:

function either_String_existor_not($str, $character) {
    if (strpos($str, $character) !== false) {
        return true;
    }
    return false;
}
7
M Razwan

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

strpos() işlevini de kullanabilirsiniz.

6
devpro

Kullanın:

$text = 'This is a test';
echo substr_count($text, 'is'); // 2

// So if you want to check if is exists in the text just put
// in a condition like this:
if (substr_count($text, 'is') > 0) {
    echo "is exists";
}
5
Kamaro Lambert

Daha basit bir seçenek:

return ( ! empty($a) && strpos($a, 'are'))? true : false;
4
ShirleyCC

Bence iyi bir fikir mb_stpos kullanmaktır:

$haystack = 'How are you?';
$needle = 'are';

if (mb_strpos($haystack, $needle) !== false) {

    echo 'true';
}

Çünkü bu çözüm büyük/küçük harfe duyarlı ve tüm Unicode karakterleri için güvenli.


Ancak bunu da yapabilirsiniz ( sauch yanıtı henüz gelmedi ):

if (count(explode($needle, $haystack)) > 1) {

    echo 'true';
}

Bu çözüm ayrıca büyük/küçük harfe duyarlı ve Unicode karakterleri için güvenli.

Ayrıca siz ifadedeki olumsuzlamayı kullanmayın, kodun okunabilirliğini arttırır.


İşte başka bir çözüm işlev kullanarak:

function isContainsStr($haystack, $needle) {

    return count(explode($needle, $haystack)) > 1;
}

if (isContainsStr($haystack, $needle)) {

    echo 'true';
}
4
simhumileco

Kullanın:

$a = 'How are you?';
if (mb_strpos($a, 'are')) {
    echo 'true';
}

Çok baytlı bir güvenli strpos () işlemi gerçekleştirir.

3
Mindexperiment

Ayrıca strchr() ve strrchr() işlevlerini ve çok baytlı dizeler için uzantıları mb_strchr() ve mb_strrchr() komutlarını kullanabilirsiniz. Bu işlevler, dizgelerin bölümlerini ve hiçbir şey bulunmazsa FALSE işlevini döndürür.

  • strchr() - Bir dizgenin ilk oluşumunu bulun ( strstr() 'nin bir diğer adıdır).
  • strrchr() - Karakterin son karakterini dizgede bulabilirsiniz.
3
Aleksey Bykov