2010-07-18 14 views
5

Come si può cercare una stringa parziale durante la digitazione (non usare MySQL) come la funzione LIKE in MySQL ma usando PHP durante la ricerca di una stringa, ad es.Ricerca stringhe parziali PHP

<?php  

$string = "Stackoverflow"; 

$find = "overfl"; 

if($find == $string) 
{ 
    return true; 
} 
else 
{ 
    return false 
} 

?> 

Ma questo, ovviamente, il lavoro non sarà, ma c'è una funzione in cui è possibile cercare in parte di una stringa? Sarebbe fantastico :)

EDIT:

E se fosse stato in un array?

se uso lo strpos, fa l'eco, se lo uso, va come truetruetruetruetrue.

risposta

12

Io tendo ad usare strpos

$needle='appy'; 
$haystack='I\'m feeling flappy, and you?'; 

if(strpos($haystack,$needle)!==false){ 
    //then it was found 
    } 

Se si vuole ignorare caso, utilizzare stripos.

Si noti che una sottigliezza di ciò è che se l'ago si trova all'inizio del pagliaio, in posizione 0, viene restituito l'intero 0. Ciò significa che è necessario confrontare a false, utilizzando il confronto rigoroso, oppure può produrre un falso negativo.

Come indicato nel manuale, collegato sopra

Warning

Questa funzione può restituire booleana FALSE, ma può anche restituire un valore non-Booleano che restituisce FALSE, come ad esempio 0 o "". Si prega di leggere la sezione su Booleans per ulteriori informazioni . Utilizzare l'operatore === per testando il valore restituito di questa funzione .

Per quanto riguarda l'utilizzo di matrici, lo strpos è pensato per prendere due stringhe. L'utilizzo di un array produce Warning: strpos() expects parameter 1 to be string, array given o 1Avvertenza: strpos(): needle non è una stringa o un intero`.

Ok, supponiamo che tu abbia una serie di stringhe per le quali cercare.

Puoi

$needles=array('hose','fribb','pancake'); 
$haystack='Where are those pancakes??'; 

foreach($needles as $ndl){ 
    if(strpos($haystack,$ndl)!==false){ echo "'$ndl': found<br>\n"; } 
    else{ echo "'$ndl' : not found<br>\n"; } 
} 

Un altro modo di cercare stringhe multiple in una stringa, senza l'utilizzo di una matrice ... Questo ti dice solo se è stata trovata almeno una partita.

$haystack='Where are those pancakes??'; 
$match=preg_match('#(hose|fribb|pancake)#',$haystack); 
//$match is now int(1) 

Oppure utilizzare preg_match_all per vedere quante partite ci sono, totale.

$all_matches=preg_match_all('#(hose|fribb|pancake)#',$haystack,$results); 
//all_matches is int(2). Note you also have $results, which stores which needles matched. 

In questo, il termine di ricerca è un'espressione regolare. () raggruppa i termini insieme e | significa "o". # indica l'inizio e la fine del modello. I regex possono diventare abbastanza complicati rapidamente, ma ovviamente funzionano! Spesso vengono evitati per motivi di prestazioni, ma se si stanno testando più stringhe, questo potrebbe essere più efficiente del loro metodo di loop array descritto sopra. Sono sicuro che ci sono anche altri modi per farlo.

+0

Ok, bene. E se fosse in un array? (controlla post modificato). – MacMac

+0

Vuoi dire che il pagliaio è un array? O l'ago? Controlla i documenti PHP - il primo commento è attualmente 'strpos che accetta un array per $ needle' – JAL

+0

In sostanza dovrai usare foreach per iterare sull'array, qualunque esso sia. preg_match è una soluzione praticabile se hai molti "aghi" e un "pagliaio". – JAL

3

strstr()/stristr() (quest'ultimo è case-insensitive)

if(strstr($string,$find)!==false){ 
    //true 
} 
3

strpos() può farlo.

if(strpos($string, $find) !== false) 
. . . 

Nota che può restituire 0, quindi utilizzare l'operatore type-equal.

+1

Quando si esegue il test per l'esistenza, è necessario utilizzare un confronto rigoroso con false ('! == false'). – BoltClock

+0

Sì, l'ho modificato mentre stavi dando il downvote. Dai un paio di secondi, ok? –

+0

Penso che il downender abbia votato prima della modifica. È stato revocato anche se apparentemente. No, non ero quello che ha downvoted :) – BoltClock