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?
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.
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
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";
}
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.";
}
$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)
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)
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";
}
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 )
$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';
}
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";
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!
Créez une nouvelle variable avec $newStr
remplaçant la valeur dans le tableau de la chaîne d'origine.
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.
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.
$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';
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" }
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)