जांचें कि क्या स्ट्रिंग में सरणी में कोई मान है


84

मैं यह पता लगाने की कोशिश कर रहा हूं कि क्या एक स्ट्रिंग में कम से कम एक URL है जो किसी सरणी में संग्रहीत है।

यहाँ मेरी सरणी है:

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

स्ट्रिंग को उपयोगकर्ता द्वारा दर्ज किया गया है और PHP के माध्यम से प्रस्तुत किया गया है। पुष्टिकरण पृष्ठ पर मैं यह जांचना चाहूंगा कि URL दर्ज किया गया है या नहीं।

मैंने निम्नलिखित कोशिश की है:

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

कोई फर्क नहीं पड़ता कि रिटर्न क्या है, हमेशा "मैच नहीं मिला"।

क्या यह चीजों को करने का सही तरीका है?


मेरे उत्तर की जाँच करें, मुझे लगता है कि आप इसे उपयोगी पाएंगे।
FarrisFahad

जवाबों:


90

इसे इस्तेमाल करे।

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

यदि आप केस-असंवेदनशील की जांच करना चाहते हैं, तो स्ट्रिसर () या स्ट्रिपोज़ () का उपयोग करें ।


3
लगभग - यह "मिलान नहीं मिला" प्रतिध्वनित करेगा और यदि सूची में पहला url मेल नहीं खाता है, तो भी वापस आ जाएगा, भले ही दूसरा कोई भी हो। elseब्लॉक की सामग्री को foreachलूप के नीचे जाने की आवश्यकता है ।
उलरिच श्मिट-गोएर्ट्ज़

इसे स्थान देने के लिए धन्यवाद। बस मेरे जवाब में सुधार हुआ।
डेनियल व्रुत

आपने $ स्ट्रिंग के बाद एक ")" भी याद किया है :)
danyo

7
मैनुअल से:**Note**: If you only want to determine if a particular needle occurs within haystack, use the faster and less memory intensive function strpos() instead.
योशी

5
यदि उपयोगकर्ता किसी डोमेन में प्रवेश करता है तो @danyo यह काम नहीं करेगा site3.com। यह मैच होगा mysite3.comजब यह नहीं करना चाहिए
billyonecan

23

इसे इस्तेमाल करे:

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

- धन्यवाद


8
यह मानता है कि तार अंतरिक्ष से अलग हो गए हैं। उदाहरण के लिए यह निम्नलिखित स्ट्रिंग के लिए काम नहीं करेगाMy url is https://website3.com
won'tлин the

4
और 'मेरे पास वेबसाइट 3 डॉट डोमेन' के लिए भी काम नहीं करेगा। यह मानता है कि स्ट्रिंग अंत में है, जिसे आप उपयोगकर्ता द्वारा प्रतिबद्ध पाठ के साथ काम नहीं कर सकते हैं
Samuël Visser

20

str_replaceगणना पैरामीटर के साथ सरल यहां काम करेगा:

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

अधिक जानकारी - https://www.techpurohit.com/extended-behaviour-explode-and-strreplace-php


अच्छा, मुझे एक संदेह है .. यह स्ट्रिंग के url के मिलान के लिए ठीक काम करता है ... मेरे पास एक स्ट्रिंग है $ string = 'you-are-nice'; $ string2 = 'you-are-nicer'; और मेरा $ मैच = 'अच्छा'; मुझे अच्छे शब्द का मिलान करना होगा, भले ही मेरा मैच स्ट्रिंग अच्छा हो, अच्छा नहीं ...
श्रीनिवास ०

16

यह करना बहुत आसान था यदि आप करना चाहते हैं तो एक सरणी में एक स्ट्रिंग ढूंढना है।

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

2
आपका इनपुट ऐरे वास्तव में एक स्ट्रिंग है।
बरगी

3
मुझे लगता है कि यह सबसे अच्छा जवाब है, लेकिन कोड में सरल गलती के कारण उत्थान नहीं हुआ। @ बरगी मैंने उत्तर संपादित किया और अब यह सरणी और उससे भी अधिक, कई उप सरणियाँ और उनकी विधि अभी भी बहुत अच्छी तरह से काम करती है !!
तारिक

यह अच्छी तरह से काम करता है, लेकिन यह आपको बताता नहीं है कि सरणी किस कुंजी के साथ मेल खाती है।
आहिल

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

उत्पादन

bool(true)

2
सन्दर्भ के लिए; create_functionपीएचपी 7.2 में पदावनत है
दर्रीएल ई। क्लार्क

6

मुझे लगता है कि preg_match का उपयोग करने के लिए एक तेज़ तरीका है ।

$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
इस कोड स्निपेट के लिए धन्यवाद, जो कुछ सीमित, तत्काल सहायता प्रदान कर सकता है। एक उचित व्याख्या यह दर्शाती है कि यह समस्या का एक अच्छा समाधान क्यों है, यह दिखा कर इसके दीर्घकालिक मूल्य में बहुत सुधार होगा और यह भविष्य के पाठकों के लिए अन्य, समान प्रश्नों के साथ अधिक उपयोगी होगा। कृपया कुछ स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें, जिसमें आपके द्वारा की गई धारणाएँ शामिल हैं। रेफरी
एलपर टी। Turker

मुझे लगता है कि यह बेहतर उत्तर है
ड्रायब्स

अधिक सुरक्षित होने के लिए, डॉट्स को पैटर्न में addcslashes(implode('|', $owned_urls_array, '.'))
बचना

कम कोड, लेकिन निश्चित रूप से
स्ट्रैप

4

यहाँ एक मिनी-फंक्शन है जो किसी दिए गए स्ट्रिंग में एक अरै से सभी मानों को खोजता है। मैं अपनी साइट में इसका उपयोग आगंतुक आईपी के लिए जाँच करने के लिए कुछ पृष्ठों पर मेरी अनुमति सूची में है।

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
}

कैसे इस्तेमाल करे

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

डेमो: http://phpfiddle.org/lite/code/qf7j-8m09

  • स्ट्रिप समारोह बहुत सख्त नहीं है। यह संवेदनशील नहीं है या यह किसी शब्द के एक भाग से मेल खा सकता है http://php.net/manual/ro/function.stripos.xp

  • आपको लगता है कि खोज केस संवेदी उपयोग होना चाहते हैं strpos http://php.net/manual/ro/function.strpos.php

  • सटीक मिलान उपयोग regex ( preg_match ) के लिए, इस आदमी के उत्तर की जांच करें https://stackoverflow.com/a/25633879/4481831


1
यह केस-संवेदी है, केस-असंवेदनशील संस्करण के उपयोग के लिएstripos
hndcrftd

3

यदि आपका $stringहमेशा सुसंगत है (यानी डोमेन नाम हमेशा स्ट्रिंग के अंत में है), तो आप के explode()साथ उपयोग कर सकते हैं end(), और फिर in_array()एक मैच के लिए जांच करने के लिए उपयोग कर सकते हैं (जैसा कि उनके उत्तर में @Aandand Solanki द्वारा बताया गया है)।

यदि नहीं, तो आप स्ट्रिंग से डोमेन निकालने के लिए एक नियमित अभिव्यक्ति का उपयोग करके बेहतर होंगे, और फिर in_array()एक मैच के लिए जाँच करें।

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

उपरोक्त अभिव्यक्ति शायद बेहतर हो सकती है (मैं इस क्षेत्र में विशेष रूप से जानकार नहीं हूं)

यहाँ एक डेमो है


2

आप एंकोड के साथ सरणी मानों को अलग कर सकते हैं और एक विभाजक | और फिर मूल्य की खोज करने के लिए preg_match का उपयोग करें।

यहाँ मैं के साथ आया समाधान है ...

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

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

सुरुचिपूर्ण होने के लिए टिक का जवाब होना चाहिए
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

आप सरणी मानों के लिए पूरे स्ट्रिंग की जाँच कर रहे हैं। तो आउटपुट हमेशा होता है false

मैं इस मामले में array_filterऔर दोनों का उपयोग करता हूं strpos

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

आप in_array ( http://php.net/manual/en/function.in-array.php ) फ़ंक्शन का उपयोग नहीं कर रहे हैं :

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

सरणी में $ सुई का एक मूल्य होना चाहिए, इसलिए आपको पहले स्ट्रिंग से यूआरएल निकालने की आवश्यकता है (उदाहरण के लिए एक नियमित अभिव्यक्ति के साथ)। कुछ इस तरह:

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

0

यदि आप सटीक शब्द मिलान प्राप्त करने का प्रयास कर रहे हैं (यूआरएल के अंदर रास्ते नहीं हैं)

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

आउटपुट:

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

मुझे यह तेज और सरल बिना लूप के चलता है।

$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!';
}

थोड़ा स्पष्टीकरण!

  1. $newStrमूल स्ट्रिंग की सरणी में मान बदलने के साथ नया चर बनाएं ।

  2. स्ट्रिंग तुलना करें - यदि मान 0 है, तो इसका मतलब है, तार बराबर हैं और कुछ भी प्रतिस्थापित नहीं किया गया था, इसलिए स्ट्रिंग में कोई मान मौजूद नहीं है।

  3. अगर यह 2 के विपरीत है, यानी, स्ट्रिंग तुलना करते समय, दोनों मूल और नए स्ट्रिंग का मिलान नहीं किया गया था, इसका मतलब है कि, कुछ को प्रतिस्थापित किया गया, इसलिए स्ट्रिंग में मान मौजूद है।


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
       }

यह किसी भी विकल्प, केस-असंवेदनशील और तेज के लिए सबसे अच्छा दृष्टिकोण है

ठीक वैसे ही जैसे im mysql

उदाहरण के लिए:

उस तालिका से * चुनें जहां नाम = "% वेब%"


0

मैं इस फ़ंक्शन के साथ आया था जो मेरे लिए काम करता है, आशा है कि यह किसी की मदद करेगा

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

इसके अलावा, ध्यान दें कि स्ट्रैप्स () के साथ उत्तर सही होगा यदि मिलान शब्द अन्य शब्द का एक हिस्सा है। उदाहरण के लिए यदि शब्द सूची में 'सेंट' है और यदि आपकी स्ट्रिंग में 'स्ट्रीट' है, तो स्ट्रैप्स () सही हो जाएगा


-3

इसके लिए धन्यवाद - बस कस्टम 404 त्रुटि पेज पर उपयोग के लिए 404 त्रुटि पेज चेकर का उपयोग करने के लिए एक साधारण विकसित करने के लिए मूल प्रश्न के इस उत्तर का उपयोग करने में सक्षम है।

यहाँ जाता हैं:

आपको अपनी साइट में livePages के एक सरणी की जरूरत है, सरणी / DB आदि के माध्यम से, यहां तक ​​कि आपके <dir>पेड़ की एक सूची संशोधनों के साथ ऐसा करेगी:

मूल आईडिया का उपयोग करना, लेकिन स्ट्रैप के बजाय समान-पाठ का उपयोग करना, - यह आपको LIKE नामों की खोज करने की सुविधा देता है, इसलिए TYPOS के लिए भी अनुमति देता है, ताकि आप साउंड-ए-लाइक और लुक-ए-जैसे नामों से बच सकें ...

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

आशा है कि यह किसी की मदद करता है, जैसे इस लेख ने मुझे 404ErrorDoc पृष्ठ पर एक बहुत ही सरल खोज / मैच बनाने में मदद की है।

पृष्ठ का डिज़ाइन सर्वर को ब्राउज़र के माध्यम से किसी भी यूआरएल यूआरएल को सम्भावित URL मेल को आगे रखने में सक्षम करेगा ...

यह काम करता है - और यह सरल है, शायद ऐसा करने के लिए बेहतर तरीके हैं, लेकिन यह तरीका काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.