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


Я пытаюсь определить, содержит ли строка хотя бы один 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;
}

независимо от того, что вводится возврат всегда "матч не найден".

это правильный способ делать вещи?

15 54

15 ответов:

попробуйте это.

$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() если вы хотите проверить регистр.

попробуйте это:

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

- Спасибо

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

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

простой 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.";
}
$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)

если $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
  }
}

выражение выше, вероятно, может быть улучшено (я не особенно хорошо осведомлен в этой области)

вот демо

Я думаю, что более быстрый способ-использовать функции 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";
}
$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';
    }   

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

function array_in_string($str, array $arr) {
    foreach($arr as $arr_value) { //start looping the array
        if (strpos($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

функция strpos не очень строгий. он не чувствителен к регистру или может соответствовать части слова. http://php.net/manual/ro/function.strpos.php если ты этого хочешь чтобы поиск был более строгим, вы должны использовать другую функцию (например. проверьте этот парень ответ для строгой функции https://stackoverflow.com/a/25633879/4481831)

вы не используете функцию 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)

вы проверяете всю строку на значения массива. Так что выход всегда 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";

Если вы пытаетесь получить точное совпадение слова (не имея путей внутри 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" }
    $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';

Я считаю, это быстро и просто, без петли.

$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. do string comparison-если значение равно 0, это означает, что строки равны и ничего не было заменено, поэтому в строке не существует значения в массиве.

  3. если это наоборот 2, т. е. при выполнении сравнения строк, оба оригинала и новая строка не была сопоставлена, что означает, что-то было заменено, следовательно, значение в массиве существует в строке.

спасибо за это-просто удалось использовать этот ответ на исходный вопрос, чтобы разработать простой в использовании 404 ошибка проверки страниц, для использования на пользовательских 404 страницы ошибок.

вот:

вам нужен массив живых страниц на вашем сайте, через array / DB и т. д., Даже список ваших <dir> дерево будет делать это с изменениями:

используя оригинальную идею, но используя аналогичный текст вместо strpos, - это дает вам возможность искать похожие имена, а также позволяет опечатки, так что вы можете избежать или найти звук-как и выглядеть-как имена...

<?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-адресов через браузер...

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