web-dev-qa-db-fra.com

Vérifier si la chaîne contient une valeur dans un tableau

J'essaie de détecter si une chaîne contient au moins une URL stockée dans un tableau.

Voici mon tableau:

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

La chaîne est entrée par l'utilisateur et soumise via PHP. Sur la page de confirmation, j'aimerais vérifier si l'URL entrée est dans le tableau.

J'ai essayé ce qui suit:

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

Peu importe ce qui est entré, le retour est toujours "Match not found".

Est-ce la bonne façon de faire les choses?

59
danyo

Essaye ça.

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

Utilisez stristr () ou stripos () si vous souhaitez vérifier la casse.

63
Daniele Brugnara

Essaye ça:

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

-Merci

17
Anand Solanki

Cela était beaucoup plus facile à faire si tout ce que vous vouliez faire était de trouver une chaîne dans un tableau.

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

Le paramètre simple str_replace with count fonctionnerait ici:

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

sortie

bool(true)
7
RafH

Si votre $string est toujours cohérent (c'est-à-dire que le nom de domaine est always à la fin de la chaîne), vous pouvez utiliser explode() avec end(), puis utiliser in_array() pour rechercher une correspondance (comme l'a souligné @Anand Solanki dans leur réponse).

Sinon, vous feriez mieux d'utiliser une expression régulière pour extraire le domaine de la chaîne, puis d'utiliser in_array() pour rechercher une correspondance.

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

L'expression ci-dessus pourrait probablement être améliorée (je ne suis pas particulièrement au courant dans ce domaine)

Voici une démo

3
billyonecan

Je pense qu’un moyen plus rapide consiste à utiliser 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";
}
3
vencedor

Voici une mini-fonction qui recherche toutes les valeurs d'un tableau dans une chaîne donnée ..__ Je l'utilise sur mon site pour vérifier que l'adresse IP du visiteur est dans ma liste des sites autorisés sur certaines pages.

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
}

comment utiliser

$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

la fonction strpos n'est pas très stricte. ce n'est pas sensible à la casse ou peut correspondre à une partie d'un mot . http://php.net/manual/ro/function.strpos.php si vous voulez que la recherche soit plus stricte vous devez utiliser une fonction différente (par exemple, cochez cette réponse pour une fonction stricte https://stackoverflow.com/a/25633879/4481831 )

1
eliz82
$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
Sandesh

Vous vérifiez la chaîne entière aux valeurs de tableau. Donc, la sortie est toujours false.

J'utilise à la fois array_filter et strpos dans ce cas.

<?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";
1
revo

Je trouve cela simple et rapide sans courir de boucle.

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

Petite explication!

  1. Créez une nouvelle variable avec $newStr remplaçant la valeur dans le tableau de la chaîne d'origine.

  2. Effectuer une comparaison de chaîne - Si la valeur est 0, cela signifie que les chaînes sont égales et que rien n’a été remplacé. Par conséquent, aucune valeur dans array n’existe dans la chaîne.

  3. s'il est inversement égal à 2, c'est-à-dire que, lors de la comparaison de chaînes, la chaîne d'origine et la nouvelle chaîne ne correspondent pas, ce qui signifie que quelque chose a été remplacé. Par conséquent, la valeur dans array existe dans string.

0
user3767643
    $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
Tahir Jamil

Si vous essayez d'obtenir une correspondance exacte de Word (ne pas avoir de chemins dans les 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));

Sortie: 

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

Vous n'utilisez pas correctement la fonction in_array ( http://php.net/manual/en/function.in-array.php ):

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

Le paramètre $ needle doit avoir une valeur dans le tableau, vous devez donc d'abord extraire l'URL de la chaîne (avec une expression régulière par exemple). Quelque chose comme ça:

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