it-swarm.com.de

Prüfen Sie, ob die Zeichenfolge einen Wert im Array enthält

Ich versuche zu ermitteln, ob eine Zeichenfolge mindestens eine URL enthält, die in einem Array gespeichert ist.

Hier ist mein Array:

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

Die Zeichenfolge wird vom Benutzer eingegeben und über PHP übermittelt. Auf der Bestätigungsseite möchte ich prüfen, ob die eingegebene URL im Array enthalten ist.

Ich habe folgendes versucht:

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

Egal was eingegeben wird, die Rückgabe ist immer "Übereinstimmung nicht gefunden".

Ist dies der richtige Weg, Dinge zu tun?

59
danyo

Versuche dies.

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

Verwenden Sie stristr () oder stripos () , wenn Sie die Groß- und Kleinschreibung nicht berücksichtigen möchten.

63

Versuche dies:

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

-Vielen Dank

17
Anand Solanki

Dies war viel einfacher, wenn Sie nur eine Zeichenfolge in einem Array suchen möchten.

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

Ein einfacher str_replace mit count-Parameter würde hier funktionieren:

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

Ausgabe

bool(true)
7
RafH

Wenn Ihr $string immer konsistent ist (dh der Domänenname lautet always am Ende des Strings), können Sie explode() mit end() verwenden und dann mit in_array() nach einer Übereinstimmung suchen (wie von @Anand Solanki angegeben) in ihrer Antwort).

Wenn nicht, wäre es besser, einen regulären Ausdruck zu verwenden, um die Domäne aus der Zeichenfolge zu extrahieren, und dann mit in_array() nach einer Übereinstimmung suchen.

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

Der obige Ausdruck könnte wahrscheinlich verbessert werden (ich bin in diesem Bereich nicht besonders kenntnisreich)

Hier ist eine Demo

3
billyonecan

Ich denke, ein schneller Weg ist die Verwendung von 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";
}
3
vencedor

Hier ist eine Minifunktion, mit der alle Werte eines Arrays in einer bestimmten Zeichenfolge durchsucht werden .. __ Ich verwende diese Option auf meiner Website, um zu überprüfen, ob die IP-Adresse eines Besuchers in meiner zulässigen Liste auf bestimmten Seiten enthalten ist.

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
}

wie benutzt man

$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 funktion ist nicht sehr streng. Die Groß-/Kleinschreibung wird nicht berücksichtigt, oder es kann mit einem Teil eines Wortes übereinstimmen http://php.net/manual/ro/function.strpos.php .__ Sie müssen eine andere Funktion verwenden (überprüfen Sie diese Antwort für eine strikte Funktion https://stackoverflow.com/a/25633879/4481831 ).

1
eliz82
$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
Sandesh

Sie prüfen die gesamte Zeichenfolge auf die Array-Werte. Die Ausgabe ist also immer false.

Ich verwende in diesem Fall sowohl array_filter als auch 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";
1
revo

Ich finde das schnell und einfach ohne laufende Schleife.

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

Kleine Erklärung!

  1. Erstellen Sie eine neue Variable, wobei $newStr den Wert im Array der ursprünglichen Zeichenfolge ersetzt.

  2. Stringvergleich durchführen - Wenn der Wert 0 ist, bedeutet dies, dass die Zeichenfolgen gleich sind und nichts ersetzt wurde. Daher ist kein Wert im Array in der Zeichenfolge vorhanden.

  3. ist es umgekehrt von 2, d. h., während beim Vergleich der Zeichenfolgen sowohl die ursprüngliche als auch die neue Zeichenfolge nicht übereinstimmten, bedeutet dies, dass etwas ersetzt wurde, sodass der Wert im Array in der Zeichenfolge existiert.

0
user3767643
    $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
Tahir Jamil

Wenn Sie versuchen, eine exakte Word-Übereinstimmung zu erhalten (keine Pfade in URLs)

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

Ausgabe: 

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

Sie verwenden die Funktion in_array ( http://php.net/manual/de/function.in-array.php ) nicht korrekt:

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

Die $ -Nadel muss einen Wert im Array haben. Daher müssen Sie zuerst die URL aus der Zeichenfolge extrahieren (beispielsweise mit einem regulären Ausdruck). Etwas wie das:

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