Перевірте, чи рядок містить значення в масиві


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;

Використовуйте stristr () або stripos (), якщо хочете перевірити, чи не враховуються регістр.


3
Майже - це відлунить "Збіг не знайдено" і поверне false, якщо перша URL-адреса у списку не збігається, навіть якщо інша відповідає. Вміст elseблоку повинен бути нижче foreachциклу.
Ульріх Шмідт-Герц,

Дякую, що помітили це. Просто покращив свою відповідь.
Даніеле Врут,

Ви також пропустили ")" після $ string :)
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
Елин Й.

4
і навіть не працює для "У мене є домен website3.com". Це передбачає, що рядок закінчується, чого ви не можете, коли працюєте з текстом, призначеним для користувача
Самуель Віссер

20

str_replaceТут буде працювати простий параметр count:

$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 = 'ти приємніший'; і мій $ match = 'nice'; Мені потрібно підібрати слово приємно, а не приємніше, навіть якщо мій рядок збігу приємний ...
Srinivas08

17

Це було набагато простіше зробити, якщо все, що ти хочеш зробити, - це знайти рядок у масиві.

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

2
Ваш вхідний масив насправді є рядком.
Бурджі

3
Я думаю, це КРАЩИЙ ВІДПОВІДЬ, але я не отримав оцінок за просту помилку в коді. @Burgi Я відредагував відповідь, і тепер це масив і навіть більше, кілька підмасивів та його метод все ще працюють дуже добре !!
Тарік

Це працює добре, але не говорить вам, з яким ключем відповідає масив.
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 );

вихід

bool(true)

2
для довідки; create_functionзастаріло в PHP 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
Дякуємо за цей фрагмент коду, який може надати обмежену негайну допомогу. Належне пояснення буде значно поліпшити свою довгострокову цінність, показуючи , чому це є хорошим рішенням проблеми і зробить його більш корисним для читачів майбутніх з іншими подібними питаннями. Будь ласка, відредагуйте свою відповідь, щоб додати пояснення, включаючи припущення, які ви зробили. ref
Alper t. Turker

Я думаю, що це краща відповідь
dryobs

Щоб бути більш захищеними, точки потрібно виводити за шаблоном:addcslashes(implode('|', $owned_urls_array, '.'))
dryobs

менше коду, але точно набагато повільніше, ніж strpos
hndcrftd

4

Ось міні-функція, яка здійснює пошук усіх значень з масиву в заданому рядку. Я використовую це на своєму сайті, щоб перевірити, чи є IP відвідувача в моєму дозволеному списку на певних сторінках.

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


1
це stripos
ІЗ

3

Якщо ваше $stringзначення завжди узгоджується (тобто доменне ім’я завжди знаходиться в кінці рядка), ви можете використовувати explode()with end(), а потім використовувати in_array()для перевірки відповідності (як вказав @Anand 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

Ви можете об'єднати значення масиву за допомогою implode та роздільника | а потім використовуйте 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-адресу із рядка (наприклад, із регулярним виразом). Щось на зразок цього:

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

0

Якщо ви намагаєтесь отримати точну відповідність слова (не мають шляхів всередині URL-адрес)

$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

напр .:

виберіть * з таблиці, де name = "% web%"


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

Також зауважте, що відповіді за допомогою strpos () повернуть true, якщо відповідне слово є частиною іншого слова. Наприклад, якщо список слів містить 'st', а якщо рядок містить 'street', strpos () поверне true


-3

ДЯКУЄМО за це - просто зміг використати цю відповідь на вихідне запитання, щоб розробити просту у використанні перевірку сторінок 404 Error для використання на Спеціальних сторінках помилок 404.

Ось:

Вам потрібен масив livePages на вашому сайті, через масив / БД тощо, навіть список вашого <dir>дерева зробить це зі змінами:

Використовуючи оригінальну ІДЕЮ, але використовуючи подібний текст замість strpos, - це дає вам можливість шукати імена 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-адрес з будь-якими викликаними URL-адресами ...

Це працює - і це настільки просто, можливо, є кращі способи зробити це, але цей спосіб працює.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.