PHP检查string是否包含数组中的值

我想检测一个string是否至less包含一个存储在数组中的url。

这是我的数组:

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

该string是用户input并通过PHP提交。 在确认页面上,我想检查input的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; } 

无论input什么,回报总是“匹配未find”。

这是做事的正确方法吗?

尝试这个。

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

– 谢谢

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

简单的str_replace与计数参数将在这里工作:

 $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总是一致的(即域名总是在string的末尾),你可以在end()使用explode() end() ,然后使用in_array()来检查是否匹配@Anand Solanki在他们的回答中)。

如果不是,最好使用正则expression式从string中提取域,然后使用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 } } 

上面的expression可能可以改善(我在这个领域不是特别的知识)

这是一个演示

如果你想做的事情是在数组中find一个string,这样做要容易得多。

 $array = "they has mystring in it"; if (stripos(json_encode($array),'mystring') !== false) { echo "found mystring"; } 
 $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'; } 

这是一个迷你函数,它可以search给定string中数组中的所有值。 我在我的网站使用这个来检查访问者的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>"; } 

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

strpos函数不是很严格。 不区分大小写,也可以匹配单词的一部分。 http://php.net/manual/ro/function.strpos.php如果你想search更严格,你必须使用不同的function

你没有正确使用函数in_array( http://php.net/manual/en/function.in-array.php ):

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

$ needle必须在数组中有一个值,所以你首先需要从string中提取url(例如正则expression式)。 像这样的东西:

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

您正在检查整个string的数组值。 所以输出总是false

在这种情况下,我使用array_filterstrpos

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

如果你想获得确切的单词匹配(没有path里面的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'; 

感谢这个 – 刚刚能够使用这个答案的原始问题来开发一个简单的404错误页面检查器,用于自定义404错误页面。

开始:

你需要在你的站点通过数组/数据库等一系列的livePages,甚至你的<dir>树的列表将做这个修改:

使用原始的IDEA,但使用类似的文本,而不是strpos, – 这给你的设施来searchLIKE的名字,所以也允许TYPOS,所以你可以避免或find像声音一样,看起来像一个名字…

 <?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页面上创build一个非常简单的search/匹配。

页面的devise将使服务器可以通过浏览器提供可能的URL匹配到任何被称为的URLS …

它工作 – 而且非常简单,也许有更好的方法来做到这一点,但这种方式是有效的。