Kiểm tra xem chuỗi có chứa giá trị trong mảng không


82

Tôi đang cố gắng phát hiện xem một chuỗi có chứa ít nhất một URL được lưu trữ trong một mảng hay không.

Đây là mảng của tôi:

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

Chuỗi được nhập bởi người dùng và gửi qua PHP. Trên trang xác nhận, tôi muốn kiểm tra xem URL đã nhập có nằm trong mảng hay không.

Tôi đã thử những cách sau:

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

Bất kể nội dung nào được nhập, kết quả trả về luôn là "Không tìm thấy đối sánh".

Đây có phải là cách làm đúng?


Kiểm tra câu trả lời của tôi, tôi nghĩ bạn sẽ thấy nó hữu ích.
FarrisFahad

Câu trả lời:


88

Thử đi.

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

Sử dụng stristr () hoặc stripos () nếu bạn muốn kiểm tra phân biệt chữ hoa chữ thường.


3
Hầu như - điều này sẽ lặp lại "Không tìm thấy khớp" và trả về false nếu url đầu tiên trong danh sách không khớp, ngay cả khi một url khác cũng vậy. Nội dung của elsekhối cần đi bên dưới foreachvòng lặp.
Ulrich Schmidt-Goertz

Cảm ơn vì đã phát hiện ra điều này. Chỉ cần cải thiện câu trả lời của tôi.
Daniele Vrut,

Bạn cũng đã bỏ lỡ một ")" ra sau khi $ string :)
danyo

7
từ sách hướng dẫn:**Note**: If you only want to determine if a particular needle occurs within haystack, use the faster and less memory intensive function strpos() instead.
Yoshi

5
@danyo, điều này sẽ không hoạt động nếu người dùng nhập tên miền như site3.com. Nó sẽ phù hợp mysite3.comkhi nó không nên
billyonecan

22

Thử đi:

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

- Cảm ơn


8
Điều này giả định rằng các chuỗi được phân tách bằng dấu cách. ví dụ: nó sẽ không hoạt động đối với chuỗi sauMy url is https://website3.com
Елин Й.

4
và thậm chí sẽ không hoạt động cho 'Tôi có miền website3.com'. Điều này giả định chuỗi là vào cuối, mà bạn không thể khi làm việc với văn bản do người dùng cam kết
Samuel Visser

20

Đơn giản str_replacevới tham số đếm sẽ hoạt động ở đây:

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

Thông tin thêm - https://www.techpurohit.com/extended-behaviour-explode-and-strreplace-php


Rất tốt, tôi có một nghi ngờ .. điều này hoạt động tốt để khớp với url của chuỗi ... Tôi có một chuỗi $ string = 'you-are-nice'; $ string2 = 'bạn đẹp hơn'; and my $ match = 'nice'; Tôi cần phải phù hợp với lời tốt đẹp, không đẹp hơn ngay cả khi chuỗi trận đấu của tôi là đẹp ...
Srinivas08

15

Điều này dễ thực hiện hơn rất nhiều nếu tất cả những gì bạn muốn làm là tìm một chuỗi trong một mảng.

$array = ["they has mystring in it", "some", "other", "elements"];
if (stripos(json_encode($array),'mystring') !== false) {
echo "found mystring";
}

1
Mảng đầu vào của bạn thực sự là một chuỗi.
Burgi

3
Tôi nghĩ đây là CÂU TRẢ LỜI TỐT NHẤT nhưng đã không nhận được lượt ủng hộ vì lỗi đơn giản trong mã. @Burgi Tôi đã chỉnh sửa câu trả lời và bây giờ nó là mảng và thậm chí hơn thế nữa, nhiều mảng phụ và phương thức của anh ấy vẫn hoạt động rất tốt !!
Tarik

Điều này hoạt động tốt nhưng nó không cho bạn biết mảng được khớp với khóa nào.
ahinkle

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

đầu ra

bool(true)

2
để tham khảo; create_functionkhông được chấp nhận trong PHP 7.2
Darryl E. Clarke

6

Tôi nghĩ rằng một cách nhanh hơn là sử dụng 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";
}

4
Cảm ơn bạn về đoạn mã này, đoạn mã này có thể cung cấp một số trợ giúp hạn chế, tức thì. Một lời giải thích thích hợp sẽ cải thiện đáng kể giá trị lâu dài của nó bằng cách chỉ ra lý do tại sao đây là một giải pháp tốt cho vấn đề và sẽ hữu ích hơn cho những người đọc trong tương lai với những câu hỏi tương tự khác. Vui lòng chỉnh sửa câu trả lời của bạn để thêm một số giải thích, bao gồm cả những giả định bạn đã đưa ra. ref
Alper t. Turker

Tôi nghĩ đó là câu trả lời tốt hơn
dryobs

Để được an toàn hơn, chấm phải được thoát ra trong mẫu:addcslashes(implode('|', $owned_urls_array, '.'))
dryobs

ít mã hơn, nhưng chắc chắn chậm hơn nhiều so với strpos
hndcrftd

4

Đây là một hàm mini tìm kiếm tất cả các giá trị từ một mảng trong một chuỗi nhất định. Tôi sử dụng điều này trong trang web của mình để kiểm tra xem IP của khách truy cập có nằm trong danh sách được phép của tôi trên các trang nhất định không.

function array_in_string($str, array $arr) {
    foreach($arr as $arr_value) { //start looping the array
        if (stripos($str,$arr_value) !== false) return true; //if $arr_value is found in $str return true
    }
    return false; //else return false
}

cách sử dụng

$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


1
nó có phân biệt chữ hoa chữ thường, để sử dụng phiên bản không phân biệt chữ hoa chữ thườngstripos
hndcrftd

3

Nếu của bạn $stringluôn nhất quán (tức là tên miền luôn ở cuối chuỗi), bạn có thể sử dụng explode()với end()và sau đó sử dụng in_array()để kiểm tra sự trùng khớp (như được chỉ ra bởi @Anand Solanki trong câu trả lời của họ).

Nếu không, tốt hơn hết bạn nên sử dụng một biểu thức chính quy để trích xuất miền khỏi chuỗi và sau đó sử dụng in_array()để kiểm tra xem có khớp hay không.

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

Biểu hiện ở trên có thể được cải thiện (tôi không am hiểu nhiều về lĩnh vực này)

Đây là bản demo


2

Bạn có thể nối các giá trị mảng với mã ghép và dấu phân cách | và sau đó sử dụng preg_match để tìm kiếm giá trị.

Đây là giải pháp tôi đã nghĩ ra ...

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

if(!preg_match("/$emails/i", $email)){
 // do something
}

nên là câu trả lời được đánh dấu cho sự thanh lịch
ceyquem

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

1

Bạn đang kiểm tra toàn bộ chuỗi cho các giá trị mảng. Vì vậy, sản lượng luôn luôn false.

Tôi sử dụng cả hai array_filterstrpostrong trường hợp này.

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

0

Bạn không sử dụng đúng hàm in_array ( http://php.net/manual/en/ Chức năng.in-array.php ):

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

$ Kim phải có một giá trị trong mảng, vì vậy trước tiên bạn cần trích xuất url từ chuỗi (ví dụ: với một biểu thức chính quy). Một cái gì đó như thế này:

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

0

Nếu bạn đang cố gắng khớp từ chính xác (không có đường dẫn bên trong 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));

Đầu ra:

array(1) { [4]=> string(12) "website3.com" }

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

0

Tôi thấy điều này nhanh chóng và đơn giản mà không cần chạy vòng lặp.

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

Giải thích chút!

  1. Tạo biến mới với $newStrgiá trị thay thế trong mảng của chuỗi gốc.

  2. Thực hiện so sánh chuỗi - Nếu giá trị là 0, điều đó có nghĩa là các chuỗi bằng nhau và không có gì được thay thế, do đó không có giá trị nào trong mảng tồn tại trong chuỗi.

  3. nếu nó ngược lại với 2, tức là, trong khi thực hiện so sánh chuỗi, cả chuỗi gốc và chuỗi mới đều không khớp, điều đó có nghĩa là một thứ gì đó đã được thay thế, do đó giá trị trong mảng tồn tại trong chuỗi.


0
  $search = "web"
    $owned_urls = array('website1.com', 'website2.com', 'website3.com');
          foreach ($owned_urls as $key => $value) {
         if (stristr($value, $search) == '') {
        //not fount
        }else{
      //found
       }

đây là cách tiếp cận tìm kiếm tốt nhất cho bất kỳ chuỗi con nào, không phân biệt chữ hoa chữ thường và nhanh chóng

giống như tôi mysql

Ví dụ:

chọn * từ bảng trong đó name = "% web%"


0

Tôi đã nghĩ ra chức năng này phù hợp với tôi, hy vọng nó sẽ giúp được ai đó

$word_list = 'word1, word2, word3, word4';
$str = 'This string contains word1 in it';

function checkStringAgainstList($str, $word_list)
{
  $word_list = explode(', ', $word_list);
  $str = explode(' ', $str);

  foreach ($str as $word):
    if (in_array(strtolower($word), $word_list)) {
        return TRUE;
    }
  endforeach;

  return false;
}

Ngoài ra, lưu ý rằng các câu trả lời với strpos () sẽ trả về true nếu từ phù hợp là một phần của từ khác. Ví dụ: nếu danh sách từ chứa 'st' và nếu chuỗi của bạn chứa 'street', strpos () sẽ trả về true


-3

CẢM ƠN vì điều này - chỉ có thể sử dụng câu trả lời này cho câu hỏi ban đầu để phát triển một trình kiểm tra trang Lỗi 404 đơn giản để sử dụng trên các Trang Lỗi 404 Tùy chỉnh.

Đây là:

Bạn cần một Mảng các trang trực tiếp trong trang web của mình, thông qua mảng / DB, v.v., ngay cả danh sách <dir>cây của bạn cũng sẽ thực hiện điều này với các sửa đổi:

Sử dụng IDEA ban đầu, nhưng sử dụng văn bản tương tự thay vì strpos, - điều này cung cấp cho bạn cơ sở để tìm kiếm các tên THÍCH, vì vậy cũng cho phép TYPOS, vì vậy bạn có thể tránh hoặc tìm các tên giống như Âm thanh và Nhìn giống ...

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

Hy vọng điều này sẽ giúp ích cho ai đó, giống như bài viết này đã giúp tôi tạo một tìm kiếm / kết hợp rất đơn giản trên trang 404ErrorDoc.

Thiết kế của trang sẽ cho phép máy chủ đưa ra các kết quả phù hợp URL có khả năng xảy ra với bất kỳ URL nào được gọi thông qua trình duyệt ...

Nó hoạt động - và quá đơn giản, có lẽ có nhiều cách tốt hơn để làm điều này, nhưng cách này hiệu quả.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.