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

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

jitendrapurohit
источник
Хорошо, у меня есть одно сомнение ... это отлично подходит для сопоставления URL-адреса строки ... У меня есть строка $ string = 'you-are-nice'; $ string2 = 'ты лучше'; и мой $ match = 'nice'; Мне нужно сопоставить слово "красиво", а не "лучше", даже если у меня хорошая строка соответствия ...
Srinivas08
16

Это было намного проще сделать, если все, что вам нужно, - это найти строку в массиве.

$array = ["they has mystring in it", "some", "other", "elements"];
if (stripos(json_encode($array),'mystring') !== false) {
echo "found mystring";
}
Джозеф Филберт
источник
2
Ваш входной массив на самом деле является строкой.
Burgi
3
Я думаю, что это ЛУЧШИЙ ОТВЕТ, но я не получил положительных отзывов из-за простой ошибки в коде. @Burgi Я отредактировал ответ, и теперь это массив и даже больше, несколько подмассивов, и его метод все еще работает очень хорошо !!
Tarik
Это работает хорошо, но не говорит вам, какой ключ соответствует массиву.
Ahinkle 06
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)
RafH
источник
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";
}
Vencedor
источник
4
Спасибо за этот фрагмент кода, который может оказать некоторую немедленную помощь. Надлежащее объяснение будет значительно улучшить свою долгосрочную ценность, показывая , почему это является хорошим решением проблемы и сделает его более полезным для читателей будущих с другими подобными вопросами. Пожалуйста , измените свой ответ , чтобы добавить некоторые объяснения, в том числе допущений , которые вы сделали. исх
Альпер т. 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

crisc82
источник
1
он чувствителен к регистру, для версии без stripos
учета
3

Если ваш $stringвсегда согласован (т. Е. Доменное имя всегда находится в конце строки), вы можете использовать explode()с 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
}
ФаррисФахад
источник
должен быть
отмечен
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";
revo
источник
0

Вы неправильно используете функцию in_array ( http://php.net/manual/en/function.in-array.php ):

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

$ Needle должна иметь значение в массиве, поэтому вам сначала нужно извлечь 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, то есть при сравнении строк исходная и новая строка не были сопоставлены, это означает, что что-то было заменено, следовательно, значение в массиве существует в строке.

user3767643
источник
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
       }

это лучший подход для поиска любой подстроки, без учета регистра и быстрый

как будто я 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 () вернут истину, если совпадающее слово является частью другого слова. Например, если список слов содержит 'st' и если ваша строка содержит 'street', strpos () вернет true

Да новичок
источник
-3

СПАСИБО за это - только что смог использовать этот ответ на исходный вопрос для разработки простого в использовании средства проверки страниц ошибок 404 для использования на пользовательских страницах ошибок 404.

Поехали:

Вам нужен массив livePages на вашем сайте через массив / БД и т. Д., Даже список ваших <dir> дерева сделает это с изменениями:

Используя исходную IDEA, но используя аналогичный текст вместо 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-адресов через браузер ...

Это работает - и ооочень просто, возможно, есть способы сделать это лучше, но этот способ работает.

madesignUK
источник