Var per stripos auf mehrere strings überprüfen?

Jan-Frederik Stieler

Monsterator
Moderator
Hi,
wie kann ich den eine Variable auf mehrere Strings überprüfen.
Das überprüfen auf einen string per „stripos“ funktioniert.
PHP:
<?php
$template = $page->template();
if (false !== stripos($template, 'portfolio_article')): echo 'helpModal';
Aber wie kann ich die var auf mehrere strings überprüfen?

Viele Grüße
 
Zum Beispiel so:

PHP:
<?php

function stringIsInArray(array $haystack, $needle)
{
    $needle_lc = mb_strtolower($needle, 'UTF-8');

    foreach ($haystack as $entry) {
        if ($needle_lc === mb_strtolower($entry, 'UTF-8')) {
            return true;
        }
    }

    return false;
}

$haystack = array('foo', 'bar', 'baz');

var_dump(
    // true
    stringIsInArray($haystack, 'foo'),
    stringIsInArray($haystack, 'Foo'),
    stringIsInArray($haystack, 'BAZ'),

    // false
    stringIsInArray($haystack, ' foo'),
    stringIsInArray($haystack, 'foox'),
    stringIsInArray($haystack, 'baz ')
);
 
Ich habe verstanden, dass es mehrere Suchbegriffe sein sollen. Dann würde das etwa so aussehen
PHP:
//Quelle: http://www.tagesanzeiger.ch/schweiz/standard/SPStadtpraesidenten-warnen-vor-der-112Initiative/story/26058673
$txt = <<<'TXT'
Es sind Einzelstimmen, aber gewichtige: Namhafte sozialdemokratische Exekutivpolitiker lehnen 
die 1:12-Initiative ab oder beurteilen sie zumindest kritisch. Berns Stadtpräsident Alexander Tschäppät 
wird zwar ein Ja in die Urne einlegen, weil er «solidarisch ist und auf ein gutes 
Resultat hofft». Persönlich taxiert er das Verhältnis von 1:12 aber als «eher zu eng».
TXT;

$needles = array('1:12-Initiative', 'Alexander Tschäppät');
var_dump(strifound($txt, $needles, false));  //true
var_dump(strifound($txt, $needles, true));   //true
$needles = array('1:12-Initiative', 'Alexander Tschäppät', 'Yaslaw');
var_dump(strifound($txt, $needles, false));  //false
var_dump(strifound($txt, $needles, true));   //true
$needles = array('Yaslaw', 'Fancywork');
var_dump(strifound($txt, $needles, false));  //false
var_dump(strifound($txt, $needles, true));   //false

/**
 * Sucht nach mehreren Strings
 * @param  <String>           Zu durchsuchender Text
 * @param  <Array<String>>    Aray mit den Suchstrings
 * @param  <Boolean>          Paramter true -> OR-Suche, false -> AND-Suche
 * @return <Boolean>
 */
function strifound($iHaystack , $iNeedles, $iOr = false){
    $found = false;
    foreach($iNeedles as $needle){
        if(stripos($iHaystack, $needle) !== false){
            $found = true;
        }elseif(!$iOr){
            $found = false;
            break;
        }
    }
    return $found;
}
 
Ich habe auf Grundlage des Beispielcodes auch impliziert, dass auf exakte Entsprechung (===) geprüft werden soll, dass also str(i)pos die falsche Wahl ist, weil etwa false !== strpos('Lucas Barrios', 'a') ebenfalls true liefert. So im Sinne von: „Ist x Element von {a, b, c, …}, ohne Groß-/Kleinschreibung zu beachten?“

Aber keine Ahnung, ob das so gewollt ist. :)

Edit: Ich finde es bei „whitelist matching“-Aufgaben generell eher unschön, Groß-/Kleinschreibung zu ignorieren, wenn die Einträge so eine Art interne Identifier sind. Lässt man das weg, würde es sicher auch in_array tun.
 
Zuletzt bearbeitet:
Hallo,
erst mal danke an euch.
Also
PHP:
$template = $page->template();
gibt jeweils den Namen des verwendeten Templates zurück. In der if-Abfrage soll nun auf zwei Templatenamen überprüft werden damit nur bei diesen beiden „helpModal“ ausgegeben wird.
Ich denke in_array würde es auch tun. Das Problem ist nur das $template kein Array zurück gibt sondern nur einen String.
Ich werde die Lösungen mal ausprobieren und melde mich dann nochmal.

Viele Grüße
 
$template wäre needle (siehe Parameternamen in der Doku zu in_array), der haystack wäre ein Array mit den beiden Templatenamen, gegen die geprüft werden soll.
 

Neue Beiträge

Zurück