103 votes

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

Je suis en train de chercher à détecter si une chaîne de caractères contient au moins une URL qui est stockée dans un tableau.

Voici mon tableau :

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

La chaîne de caractères est saisie par l'utilisateur et soumise via PHP. Sur la page de confirmation, je voudrais vérifier si l'URL saisie est dans le tableau.

J'ai essayé ce qui suit :

$string = 'mon nom de domaine est website3.com';
if (in_array($string, $owned_urls))
{
    echo "Correspondance trouvée"; 
    return true;
}
else
{
    echo "Aucune correspondance trouvée";
    return false;
}

Peu importe ce qui est saisi, le retour est toujours "Aucune correspondance trouvée".

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

8voto

RafH Points 2193
$string = 'mon nom de domaine est 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)

6voto

crisc2000 Points 490

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 si l'IP du visiteur est dans ma liste autorisée sur certaines pages.

function array_in_string($str, array $arr) {
    foreach($arr as $arr_value) { //commence à boucler sur le tableau
        if (stripos($str,$arr_value) !== false) return true; //si $arr_value est trouvé dans $str retourne true
    }
    return false; //sinon retourne false
}

comment utiliser

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

//cet exemple devrait retourner TROUVÉ
$string = 'mon nom de domaine est website3.com';
if (array_in_string($string, $owned_urls)) {
    echo "premier: Correspondance trouvée"; 
}
else {
    echo "premier: Aucune correspondance trouvée";
}

//cet exemple devrait retourner NON TROUVÉ
$string = 'mon nom de domaine est website4.com';
if (array_in_string($string, $owned_urls)) {
    echo "deuxième: Correspondance trouvée"; 
}
else {
    echo "deuxième: Aucune correspondance trouvée";
}

DEMO: http://phpfiddle.org/lite/code/qf7j-8m09

5voto

FarrisFahad Points 96

Vous pouvez concaténer les valeurs du tableau avec implode et un séparateur de | et ensuite utiliser preg_match pour rechercher la valeur.

Voici la solution que j'ai trouvée ...

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

if(!preg_match("/$emails/i", $email)){
 // faire quelque chose
}

3voto

billyonecan Points 10354

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

Sinon, il serait préférable d'utiliser une expression régulière pour extraire le domaine de la chaîne, puis utiliser in_array() pour vérifier une correspondance.

$string = 'Il y a une URL monsite3.com dans cette chaîne';
preg_match('/(?:http:\/\/)?(?:www.)?([a-z0-9-_]+\.[a-z0-9.]{2,5})/i', $string, $matches);

if (empty($matches[1])) {
  // aucun nom de domaine n'a été trouvé dans $string
} else {
  if (in_array($matches[1], $owned_urls)) {
    // correspondance exacte trouvée
  } else {
    // correspondance exacte non trouvée
  }
}

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

Voici une démo

2voto

revo Points 5311

Vous vérifiez toute la chaîne par rapport aux valeurs du tableau. Donc la sortie est toujours false.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X