Dizenin dizide bir değer içerip içermediğini kontrol edin


84

Bir dizenin bir dizide depolanan en az bir URL içerip içermediğini tespit etmeye çalışıyorum.

İşte dizim:

$owned_urls = array('website1.com', 'website2.com', 'website3.com');

Dize kullanıcı tarafından girilir ve PHP aracılığıyla gönderilir. Onay sayfasında, girilen URL'nin dizide olup olmadığını kontrol etmek istiyorum.

Aşağıdakileri denedim:

$string = 'my domain name is website3.com';
if (in_array($string, $owned_urls))
{
    echo "Match found"; 
    return true;
}
else
{
    echo "Match not found";
    return false;
}

Ne girilirse girilsin, dönüş her zaman "Eşleşme bulunamadı" dır.

İşleri yapmanın doğru yolu bu mu?


Cevabıma bakın, yararlı bulacağınızı düşünüyorum.
FarrisFahad

Yanıtlar:


90

Bunu dene.

$string = 'my domain name is website3.com';
foreach ($owned_urls as $url) {
    //if (strstr($string, $url)) { // mine version
    if (strpos($string, $url) !== FALSE) { // Yoshi version
        echo "Match found"; 
        return true;
    }
}
echo "Not found!";
return false;

Büyük / küçük harfe duyarlı olmadığını kontrol etmek istiyorsanız stristr () veya stripos () kullanın.


3
Neredeyse - bu, listedeki ilk url eşleşmese bile "Eşleşme bulunamadı" yankılanır ve yanlış döndürür. elseBloğun içeriğinin foreachdöngünün altına inmesi gerekir .
Ulrich Schmidt-Goertz

Bunu anladığınız için teşekkürler. Cevabımı geliştirdim.
Daniele Vrut

Ayrıca $
string'den

7
kılavuzdan:**Note**: If you only want to determine if a particular needle occurs within haystack, use the faster and less memory intensive function strpos() instead.
Yoshi

5
@danyo gibi kullanıcı bir etki alanına girerse bu işe yaramaz site3.com. mysite3.com
Olmaması

23

Bunu dene:

$owned_urls= array('website1.com', 'website2.com', 'website3.com');

$string = 'my domain name is website3.com';

$url_string = end(explode(' ', $string));

if (in_array($url_string,$owned_urls)){
    echo "Match found"; 
    return true;
} else {
    echo "Match not found";
    return false;
}

- Teşekkürler


8
Bu, dizelerin boşlukla ayrıldığını varsayar. örneğin aşağıdaki dizi için çalışmazMy url is https://website3.com
Елин Й.

4
ve hatta 'web sitesi3.com etki alanına sahibim' için çalışmayacaktır. Bu dize Eğer kullanıcı taahhüt metinlerle çalışmak olamaz sonunda, varsayar
Samuel Visser

20

str_replaceCount parametresiyle basit burada çalışır:

$count = 0;
str_replace($owned_urls, '', $string, $count);
// if replace is successful means the array value is present(Match Found).
if ($count > 0) {
  echo "One of Array value is present in the string.";
}

Daha Fazla Bilgi - https://www.techpurohit.com/extended-behaviour-explode-and-strreplace-php


Güzel, bir şüphem var .. bu, dizenin url'si ile eşleşmek için iyi çalışıyor ... Bir dizgem var $ string = 'you-are-good'; $ string2 = 'sen-daha-naziksin'; ve $ eşim = 'güzel'; Hoş kelimesini eşleştirmem gerekiyor, eşleşme dizim güzel olsa bile daha hoş değil ...
Srinivas08

17

Tek yapmak istediğiniz bir dizide bir dizge bulmaksa, bunu yapmak çok daha kolaydı.

$array = ["they has mystring in it", "some", "other", "elements"];
if (stripos(json_encode($array),'mystring') !== false) {
echo "found mystring";
}

2
Girdi diziniz aslında bir dizedir.
Burgi

3
Bence bu EN İYİ CEVAP, ancak koddaki basit hata nedeniyle olumlu oy almadı. @Burgi Cevabı düzenledim ve şimdi dizi ve hatta daha fazlası, çoklu alt diziler ve yöntemi hala çok iyi çalışıyor !!
Tarık

Bu iyi çalışıyor ancak dizinin hangi tuşla eşleştiğini size söylemez.
ahinkle

8
$string = 'my domain name is website3.com';
$a = array('website1.com','website2.com','website3.com');

$result = count(array_filter($a, create_function('$e','return strstr("'.$string.'", $e);')))>0; 
var_dump($result );

çıktı

bool(true)

2
referans için; create_functionPHP 7.2'de kullanımdan kaldırıldı
Darryl E. Clarke

6

Daha hızlı bir yolun preg_match kullanmak olduğunu düşünüyorum .

$user_input = 'Something website2.com or other';
$owned_urls_array = array('website1.com', 'website2.com', 'website3.com');

if ( preg_match('('.implode('|',$owned_urls_array).')', $user_input)){
    echo "Match found"; 
}else{
    echo "Match not found";
}

4
Sınırlı ve anında yardım sağlayabilecek bu kod parçacığı için teşekkür ederiz. Bir Doğru bir açıklama ölçüde bu soruna iyi bir çözüm olmasının nedeni göstererek uzun vadeli değerini artıracak ve diğer benzer sorularla gelecek okuyucularına daha kullanışlı bir hale getirecektir. Yaptığınız varsayımlar da dahil olmak üzere bazı açıklamalar eklemek için lütfen cevabınızı düzenleyin . ref
Alper t. Türker

Bence bu daha iyi cevap
dryobs

Daha güvenli olmak için, noktaların düzende kaçması gerekir:addcslashes(implode('|', $owned_urls_array, '.'))
dryobs

daha az kod, ancak
strpos'tan

4

Burada, belirli bir dizedeki bir dizideki tüm değerleri arayan bir mini işlev var. Bunu sitemde ziyaretçi IP'sinin belirli sayfalarda izin verilenler listemde olduğunu kontrol etmek için kullanıyorum.

function array_in_string($str, array $arr) {
    foreach($arr as $arr_value) { //start looping the array
        if (stripos($str,$arr_value) !== false) return true; //if $arr_value is found in $str return true
    }
    return false; //else return false
}

nasıl kullanılır

$owned_urls = array('website1.com', 'website2.com', 'website3.com');

//this example should return FOUND
$string = 'my domain name is website3.com';
if (array_in_string($string, $owned_urls)) {
    echo "first: Match found<br>"; 
}
else {
    echo "first: Match not found<br>";
}

//this example should return NOT FOUND
$string = 'my domain name is website4.com';
if (array_in_string($string, $owned_urls)) {
    echo "second: Match found<br>"; 
}
else {
    echo "second: Match not found<br>";
}

DEMO: http://phpfiddle.org/lite/code/qf7j-8m09


1
Büyük / küçük harfe duyarlı olmayan sürüm kullanımı için büyük / küçük harfe duyarlıdırstripos
hndcrftd

3

Sizin $stringher zaman tutarlıysa (yani, alan adı her zaman dizenin sonundaysa), explode()ile kullanabilir end()ve ardından in_array()bir eşleşme olup olmadığını kontrol etmek için kullanabilirsiniz (yanıtlarında @Anand Solanki tarafından belirtildiği gibi).

Değilse, alanı dizeden çıkarmak için normal bir ifade kullanmanız ve ardından in_array()bir eşleşme olup olmadığını kontrol etmek için kullanmanız daha iyi olur.

$string = 'There is a url mysite3.com in this string';
preg_match('/(?:http:\/\/)?(?:www.)?([a-z0-9-_]+\.[a-z0-9.]{2,5})/i', $string, $matches);

if (empty($matches[1])) {
  // no domain name was found in $string
} else {
  if (in_array($matches[1], $owned_urls)) {
    // exact match found
  } else {
    // exact match not found
  }
}

Yukarıdaki ifade muhtemelen iyileştirilebilir (bu alanda özellikle bilgili değilim)

İşte bir demo


2

Dizi değerlerini implode ve | ayırıcı ile birleştirebilirsiniz. ve sonra değeri aramak için preg_match kullanın.

İşte bulduğum çözüm ...

$emails = array('@gmail', '@hotmail', '@outlook', '@live', '@msn', '@yahoo', '@ymail', '@aol');
$emails = implode('|', $emails);

if(!preg_match("/$emails/i", $email)){
 // do something
}

zarif olmak için işaretli cevap olmalı
ceyquem

1
$owned_urls= array('website1.com', 'website2.com', 'website3.com');
    $string = 'my domain name is website3.com';
    for($i=0; $i < count($owned_urls); $i++)
    {
        if(strpos($string,$owned_urls[$i]) != false)
            echo 'Found';
    }   

1

Dizi değerlerinin tamamını kontrol ediyorsunuz. Yani çıktı her zaman false.

İkisini de kullanıyorum array_filterve strposbu durumda.

<?php
$urls= array('website1.com', 'website2.com', 'website3.com');
$string = 'my domain name is website3.com';
$check = array_filter($urls, function($url){
    global $string;
    if(strpos($string, $url))
        return true;
});
echo $check?"found":"not found";

0

İn_array ( http://php.net/manual/en/function.in-array.php ) işlevini doğru kullanmıyorsunuz :

bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )

$ İğne dizide bir değere sahip olmalıdır, bu nedenle önce url'yi dizeden çıkarmanız gerekir (örneğin bir normal ifade ile). Bunun gibi bir şey:

$url = extrctUrl('my domain name is website3.com');
//$url will be 'website3.com'
in_array($url, $owned_urls)

0

Tam kelime eşleşmesi elde etmeye çalışıyorsanız (URL'lerin içinde yollar yoksa)

$string = 'my domain name is website3.com';
$words = explode(' ', $string); 
$owned_urls= array('website1.com', 'website2.com', 'website3.com');
var_dump(array_intersect($words, $owned_urls));

Çıktı:

array(1) { [4]=> string(12) "website3.com" }

0
    $message = "This is test message that contain filter world test3";

    $filterWords = array('test1', 'test2', 'test3');

    $messageAfterFilter =  str_replace($filterWords, '',$message);

    if( strlen($messageAfterFilter) != strlen($message) )
        echo 'message is filtered';
    else
        echo 'not filtered';

0

Bunu döngü olmadan hızlı ve basit buluyorum.

$array = array("this", "that", "there", "here", "where");
$string = "Here comes my string";
$string2 = "I like to Move it! Move it";

$newStr = str_replace($array, "", $string);

if(strcmp($string, $newStr) == 0) {
    echo 'No Word Exists - Nothing got replaced in $newStr';
} else {
    echo 'Word Exists - Some Word from array got replaced!';
}

$newStr = str_replace($array, "", $string2);

if(strcmp($string2, $newStr) == 0) {
    echo 'No Word Exists - Nothing got replaced in $newStr';
} else {
    echo 'Word Exists - Some Word from array got replaced!';
}

Küçük açıklama!

  1. $newStrOrijinal dize dizisindeki değeri değiştirerek yeni değişken oluşturun .

  2. Dize karşılaştırması yapın - Değer 0 ise, bu, dizelerin eşit olduğu ve hiçbir şeyin değiştirilmediği anlamına gelir, dolayısıyla dizide hiç değer yoktur.

  3. 2'nin tersi ise, yani dizge karşılaştırması yapılırken hem orijinal hem de yeni dizge eşleşmedi, yani bir şey değiştirildi, dolayısıyla dizideki değer dizede var demektir.


0
  $search = "web"
    $owned_urls = array('website1.com', 'website2.com', 'website3.com');
          foreach ($owned_urls as $key => $value) {
         if (stristr($value, $search) == '') {
        //not fount
        }else{
      //found
       }

bu, herhangi bir alt dize için en iyi yaklaşımdır, büyük / küçük harfe duyarlı değildir ve hızlıdır

tıpkı im mysql gibi

ör:

isim = "% web%" olan tablodan * seçin


0

Benim için çalışan bu işlevi buldum, umarım bu birilerine yardımcı olur

$word_list = 'word1, word2, word3, word4';
$str = 'This string contains word1 in it';

function checkStringAgainstList($str, $word_list)
{
  $word_list = explode(', ', $word_list);
  $str = explode(' ', $str);

  foreach ($str as $word):
    if (in_array(strtolower($word), $word_list)) {
        return TRUE;
    }
  endforeach;

  return false;
}

Ayrıca, eşleşen sözcük başka bir sözcüğün parçasıysa strpos () ile yanıtların doğru sonucunu döndüreceğini unutmayın. Örneğin, kelime listesi 'st' içeriyorsa ve dizeniz 'sokak' içeriyorsa, strpos () doğru döndürür


-3

Bunun için TEŞEKKÜRLER - Özel 404 Hata Sayfalarında kullanılmak üzere kullanımı kolay bir 404 Hata sayfası denetleyicisi geliştirmek için orijinal soruya verilen bu yanıtı kullanabildim.

İşte:

Sitenizde dizi / DB vb. Aracılığıyla bir livePages Dizisine ihtiyacınız var, hatta <dir> ağacınızın değişikliklerle bunu yapacaktır:

Orijinal IDEA'yı kullanmak, ancak strpos yerine benzer metin kullanmak - bu size LIKE adlarını arama olanağı verir, böylece TYPOS'a da izin verir, böylece Sound-a-like ve Look-a-like isimlerden kaçınabilir veya bulabilirsiniz. ...

<?php
// We need to GRAB the URL called via the browser ::
$requiredPage = str_replace ('/', '',$_SERVER[REQUEST_URI]);

// We need to KNOW what pages are LIVE within the website ::
$livePages = array_keys ($PageTEXT_2col );

foreach ($livePages as $url) {

if (similar_text($requiredPage,  $url, $percent)) {
    $percent = round($percent,2); // need to avoid to many decimal places ::
    //   if (strpos($string, $url) !== FALSE) { // Yoshi version
    if (round($percent,0) >= 60) { // set your percentage of "LIKENESS" higher the refiner the search in your array ::
        echo "Best Match found = " . $requiredPage . " > ,<a href='http://" . $_SERVER['SERVER_NAME'] . "/" . $url . "'>" . $url . "</a> > " . $percent . "%"; 
        return true;
    } 
}
}    
echo "Sorry Not found = " . $requiredPage; 
return false;
?>

Umarım bu birisine yardımcı olur, bu makale gibi bir 404ErrorDoc sayfasında çok basit bir arama / eşleşme oluşturmama yardımcı olmuştur.

Sayfanın tasarımı, sunucunun olası URL eşleşmelerini tarayıcı aracılığıyla çağrılan herhangi bir URL'ye iletmesini sağlayacaktır ...

İşe yarıyor - ve çok basit, belki bunu yapmanın daha iyi yolları var, ama bu yol işe yarıyor.

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.