Intereting Posts

php проверяет, содержит ли строка значение в массиве

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

Независимо от того, что вводится, возврат всегда «Match not found».

Это правильный способ сделать что-то?

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

 $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 будет работать простой 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 всегда согласована (то есть имя домена всегда находится в конце строки), вы можете использовать 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 } } 

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

Вот демонстрация

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

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

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

СПАСИБО для этого – просто смог использовать этот ответ на исходный вопрос для разработки простой в использовании 404-страничной проверки ошибок, для использования на пользовательских 404 страницах ошибок.

Вот оно:

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

Используя исходный IDEA, но используя аналогичный текст вместо strpos, – это дает вам возможность искать имена LIKE, а также позволяет TYPOS, поэтому вы можете избежать или найти похожие звуковые и Look-a-like имена …

 <?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-адресами через браузер …

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