Проверьте, содержит ли строка значение в массиве
Я пытаюсь определить, содержит ли строка хотя бы один 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;
}
Независимо от того, что введено, возвращаемое значение всегда "Соответствие не найдено".
Это правильный способ делать вещи?
Ответы
Ответ 1
Попробуйте это.
$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(), если вы хотите проверить регистр без учета регистра.
Ответ 2
Попробуйте следующее:
$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;
}
-
Благодаря
Ответ 3
Это было бы намного проще сделать, если все, что вы хотите сделать, это найти строку в массиве.
$array = ["they has mystring in it", "some", "other", "elements"];
if (stripos(json_encode($array),'mystring') !== false) {
echo "found mystring";
}
Ответ 4
Простой 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.";
}
Дополнительная информация - https://www.techpurohit.com/extended-behaviour-explode-and-strreplace-php
Ответ 5
$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)
Ответ 6
Я думаю, что более быстрый способ - использовать 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";
}
Ответ 7
Если ваш $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
}
}
Вышеупомянутое выражение, вероятно, может быть улучшено (я не особо осведомлен в этой области)
Ответ 8
Вот мини-функция, которая ищет все значения из массива в заданной строке.
Я использую это на своем сайте, чтобы проверить, что 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
если вы хотите, чтобы поиск был более строгим, вы должны использовать другую функцию (например, проверить этот ответ парня на строгую функцию fooobar.com/questions/320/...)
Ответ 9
$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';
}
Ответ 10
Вы проверяете всю строку на значения массива. Поэтому вывод всегда 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";
Ответ 11
Вы не используете функцию 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)
Ответ 12
Если вы пытаетесь получить точное совпадение слов (не имея путей внутри 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" }
Ответ 13
$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';
Ответ 14
Я нахожу это быстро и просто без запуска цикла.
$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!';
}
Маленькое объяснение!
-
Создайте новую переменную с заменой значения $newStr
в массиве исходной строки.
-
Сравнение строк - если значение равно 0, это означает, что строки равны и ничего не было заменено, следовательно, в строке нет значения в массиве.
-
если это значение равно 2, т.е. при сравнении строк как исходная, так и новая строки не были сопоставлены, это означает, что что-то было заменено, следовательно, значение в массиве существует в строке.
Ответ 15
СПАСИБО для этого - просто смог использовать этот ответ на исходный вопрос, чтобы разработать простую в использовании проверку страницы ошибок 404, для использования на пользовательских 404 страницах ошибок.
Здесь:
Вам нужен Массив LivePages на вашем сайте, через массив /DB и т.д., даже листинг вашего дерева <dir>
сделает это с изменениями:
Используя оригинальный IDEA, но используя аналогичный текст вместо strpos, - это дает вам возможность искать имена LIKE, а также позволяет TYPOS, поэтому вы можете избежать или найти Sound-a-like и Look-a похожие имена...
<?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-адресов через браузер...
Это работает - и это просто, возможно, есть лучшие способы сделать это, но этот способ работает.