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

82

Ich versuche festzustellen, 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 überprüfen, ob sich die eingegebene URL im Array befindet.

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

Unabhängig davon, was eingegeben wird, lautet die Rückgabe immer "Übereinstimmung nicht gefunden".

Ist das die richtige Art, Dinge zu tun?

Danyo
quelle
Schauen Sie sich meine Antwort an, ich denke, Sie werden es nützlich finden.
FarrisFahad

Antworten:

89

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.

Daniele Vrut
quelle
3
Fast - dies gibt "Übereinstimmung nicht gefunden" aus und gibt false zurück, wenn die erste URL in der Liste nicht übereinstimmt, auch wenn eine andere URL übereinstimmt. Der Inhalt des elseBlocks muss unter die foreachSchleife gehen.
Ulrich Schmidt-Goertz
Danke, dass du das entdeckt hast. Ich habe gerade meine Antwort verbessert.
Daniele Vrut
Sie haben auch ein ")" nach $ string verpasst :)
Danyo
7
aus dem Handbuch:**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 das funktioniert nicht, wenn der Benutzer eine Domain wie eingibt site3.com. Es wird passen, mysite3.comwenn es nicht sollte
Billyonecan
23

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

Anand Solanki
quelle
8
Dies setzt voraus, dass die Zeichenfolgen durch Leerzeichen getrennt sind. zB funktioniert es nicht für die folgende ZeichenfolgeMy url is https://website3.com
Елин Й.
4
und funktioniert sogar nicht für "Ich habe die Website website3.com". Dies setzt voraus, dass die Zeichenfolge am Ende ist, was Sie nicht können, wenn Sie mit benutzerdefiniertem Text arbeiten
Samuël Visser
20

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

Weitere Informationen - https://www.techpurohit.com/extended-behaviour-explode-and-strreplace-php

Jitendrapurohit
quelle
Schön, ich habe einen Zweifel. Dies funktioniert gut, um die URL des Strings abzugleichen. Ich habe einen String. $ String = 'du-bist-nett'; $ string2 = 'du bist netter'; und mein $ match = 'nice'; Ich muss das Wort nett finden, nicht schöner, auch wenn meine Übereinstimmungszeichenfolge nett ist ...
Srinivas08
15

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

$array = ["they has mystring in it", "some", "other", "elements"];
if (stripos(json_encode($array),'mystring') !== false) {
echo "found mystring";
}
Joseph Philbert
quelle
1
Ihr Eingabearray ist eigentlich eine Zeichenfolge.
Burgi
3
Ich denke, dies ist die BESTE ANTWORT , habe aber aufgrund des einfachen Fehlers im Code keine Upvotes erhalten. @ Burgi Ich habe die Antwort bearbeitet und jetzt ist es Array und noch mehr, mehrere Sub-Arrays und seine Methode funktioniert immer noch sehr gut !!
Tarik
Dies funktioniert gut, sagt Ihnen jedoch nicht, mit welchem ​​Schlüssel das Array übereinstimmt.
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 );

Ausgabe

bool(true)
RafH
quelle
2
als Referenz; create_functionist in PHP 7.2
Darryl E. Clarke
6

Ich denke, dass ein schnellerer Weg die Verwendung von preg_match ist .

$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";
}
vencedor
quelle
4
Vielen Dank für dieses Code-Snippet, das möglicherweise nur begrenzte, sofortige Hilfe bietet. Eine richtige Erklärung würde ihren langfristigen Wert erheblich verbessern, indem sie zeigt, warum dies eine gute Lösung für das Problem ist, und es für zukünftige Leser mit anderen, ähnlichen Fragen nützlicher machen. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, einschließlich der von Ihnen getroffenen Annahmen. ref
Alper t. Turker
Ich denke, es ist die bessere Antwort
Dryobs
Um sicherer zu sein, müssen Punkte im Muster addcslashes(implode('|', $owned_urls_array, '.'))
maskiert werden
weniger Code, aber definitiv viel langsamer als strpos
hndcrftd
4

Hier ist eine Minifunktion, die alle Werte aus einem Array in einer bestimmten Zeichenfolge durchsucht. Ich verwende dies auf meiner Website, um zu überprüfen, ob die IP-Adresse des Besuchers auf bestimmten Seiten in meiner zulässigen Liste enthalten ist.

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
}

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

crisc82
quelle
1
Bei einer Version, bei der die Groß- und Kleinschreibung nicht stripos
berücksichtigt wird
3

Wenn Ihr $stringimmer konsistent ist (dh. Der Domain - Name ist immer am Ende des Strings), können Sie explode()mit end(), und verwenden Sie dann in_array()nach einer Übereinstimmung überprüfen (Wie von @Anand Solanki in ihrer Antwort).

Wenn nicht, sollten Sie einen regulären Ausdruck verwenden, um die Domäne aus der Zeichenfolge zu extrahieren, und dann 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 gut informiert)

Hier ist eine Demo

Billyonecan
quelle
2

Sie können die Array-Werte mit implode und einem Trennzeichen von | verketten Verwenden Sie dann preg_match, um nach dem Wert zu suchen.

Hier ist die Lösung, die ich mir ausgedacht habe ...

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

if(!preg_match("/$emails/i", $email)){
 // do something
}
FarrisFahad
quelle
sollte die angekreuzte Antwort sein, um elegant zu sein
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';
    }   
Sandesh
quelle
1

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

Ich benutze beide array_filterund strposin diesem Fall.

<?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";
revo
quelle
0

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

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 (z. B. 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)
David Fernandes
quelle
0

Wenn Sie versuchen, eine genaue Wortü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" }
Taha Paksu
quelle
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';
Tahir Jamil
quelle
0

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, $newStrindem Sie den Wert im Array der ursprünglichen Zeichenfolge ersetzen.

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

  3. Wenn es umgekehrt zu 2 ist, dh während des Zeichenfolgenvergleichs, wurden sowohl die ursprüngliche als auch die neue Zeichenfolge nicht abgeglichen, was bedeutet, dass etwas ersetzt wurde, sodass der Wert im Array in der Zeichenfolge vorhanden ist.

user3767643
quelle
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
       }

Dies ist der beste Ansatz für die Suche nach Teilzeichenfolgen, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird und die schnell sind

genau wie im mysql

Ex:

Wählen Sie * aus der Tabelle aus, in der name = "% web%"

Yahya Ayyoub
quelle
0

Ich habe mir diese Funktion ausgedacht, die für mich funktioniert. Ich hoffe, dies wird jemandem helfen

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

Beachten Sie außerdem, dass Antworten mit strpos () true zurückgeben, wenn das übereinstimmende Wort Teil eines anderen Wortes ist. Wenn die Wortliste beispielsweise 'st' enthält und Ihre Zeichenfolge 'street' enthält, gibt strpos () true zurück

Da Anfänger
quelle
-3

DANKE dafür - konnte gerade diese Antwort auf die ursprüngliche Frage verwenden, um eine einfach zu verwendende 404-Fehlerseitenprüfung für benutzerdefinierte 404-Fehlerseiten zu entwickeln.

Hier geht:

Sie benötigen ein Array von livePages auf Ihrer Site, über Array / DB usw., selbst eine Auflistung Ihres <dir>Baums wird dies mit Änderungen tun:

Wenn Sie die ursprüngliche IDEE verwenden, aber ähnlichen Text anstelle von Strpos verwenden, haben Sie die Möglichkeit, nach ähnlichen Namen zu suchen. Dies ermöglicht auch TYPOS, sodass Sie Sound-a-like- und Look-a-like-Namen vermeiden oder finden können ...

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

Ich hoffe, dies hilft jemandem, wie dieser Artikel mir geholfen hat, eine sehr einfache Suche / Übereinstimmung auf einer 404ErrorDoc-Seite zu erstellen.

Das Design der Seite ermöglicht es dem Server, über den Browser wahrscheinliche URL-Übereinstimmungen mit allen angerufenen URLs zu erstellen ...

Es funktioniert - und ist sooo einfach, vielleicht gibt es bessere Möglichkeiten, dies zu tun, aber so funktioniert es.

madesignUK
quelle