4 Stimmen

PHP Wie testet man, ob einer der Werte eines Arrays (teilweise) in einem String vorhanden ist?

Es muss einfach sein, aber ich finde die Antwort nicht.
Wie kann man prüfen, ob einer der Werte im Array in der Zeichenkette enthalten ist?
Die Ausgabe sollte true oder false sein.

$array = Array( 
   0 => 'word1',
   1 => 'word2',
   2 => 'New York'
   3 => 'New car' 
);

$string = "Its a sunny day in New York";

Ich versuche zu klären. In diesem Fall sollte array[3] keine Übereinstimmung sein. Nur array[2] sollte übereinstimmen.

2voto

mario Punkte 141130

Der funktionale Ersatz für Ihr in_array wäre:

array_filter(
    array_map("strpos",  array_fill(0, count($words), $string), $words),
"is_int")

1voto

Felix Kling Punkte 751464

Aktualisierung:

Eine wortgrenzenunabhängige Lösung wäre das Hinzufügen von Leerzeichen um die Eingabezeichenfolge und die Suchbegriffe:

$str = ' ' . $str . ' ';

function quote($a) {
    return ' ' . preg_quote($a, '/') . ' ';
}

$word_pattern = '/' . implode('|', array_map('quote', $array)) . '/';

if(preg_match($word_pattern, $str) > 0) {

}

oder durch eine Schleife über die Begriffe:

foreach($array as $term) {
    if (strpos($str, ' '. $term . ' ') !== false) {
        // word contained
    }
}

Beide können zur Vereinfachung der Nutzung in eine Funktion eingefügt werden, z. B.

function contains($needle, $haystack) {
    $haystack = ' ' . $haystack . ' ';
    foreach($needle as $term) {
       if(strpos($haystack, ' ' . $term . ' ') !== false) {
           return true;
       }
    }
    return false;
}

Schauen Sie sich eine DEMO


Alte Antwort:

Sie können reguläre Ausdrücke verwenden:

function quote($a) {
    return preg_quote($a, '/');
}

$word_pattern = implode('|', array_map('quote', $array));

if(preg_match('/\b' . $word_pattern  . '\b/', $str) > 0) {

}

Der wichtigste Teil sind die Grenzzeichen \b hier. Sie erhalten nur dann eine Übereinstimmung, wenn der gesuchte Wert ein (eine Folge von) Wort(en) in der Zeichenfolge ist.

1voto

Marc B Punkte 347897

Eine Brute-Force-Methode wäre das:

$words = implode('|', $array);

if (preg_match("/($words)/", $string, $matches)) {
    echo "found $matches[1]";
}

0voto

Ibrahim Azhar Armar Punkte 24488
$array = Array( 
   0 => 'word1',
   1 => 'word3',
   2 => 'word3 basic',
   3 => 'good'
);

$string = "there a good word3 basic here";

//Convert the String to an array
$stringArray = explode(' ',$string);

//Loop the string
foreach($stringArray as $matchedWords) {
    if(in_array($matchedWords, $array )) {
        echo $matchedWords.'<br/>';
    }
}

0voto

$array = Array( 
   0 => 'word1',
   1 => 'word2',
   2 => 'word3'
);

$string = "there a good word3 here";

foreach($array as $word)
{
    if(strstr($string, $word))
        echo "<b>$word</b> has been detected in <b>$string</b>";
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X