2010-07-18 12 views
5

¿Cómo se puede buscar una cadena parcial al escribir (no usar MySQL) como la función LIKE en MySQL, pero usando PHP al buscar una cadena, p.Búsqueda de cadenas parciales PHP

<?php  

$string = "Stackoverflow"; 

$find = "overfl"; 

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

?> 

Pero eso obviamente no funcionará, pero ¿hay alguna función donde pueda buscar parcialmente una cadena? Eso sería genial :)

EDIT:

¿Y si era en una matriz?

si uso los strpos, hace el eco, si lo uso, va como truetruetruetruetrue.

Respuesta

12

que tienden a utilizar strpos

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

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

Si quieres que ignore caso, utilizar stripos.

Tenga en cuenta que una sutileza acerca de esto es que si la aguja está al principio del pajar, en la posición 0, se devuelve el entero 0. Esto significa que debe comparar con false, usando una comparación estricta, o puede producir un falso negativo.

Como se indica en el manual, vinculado anteriormente

Advertencia

Esta función puede devolver Boolean FALSE, pero también puede devolver un valor no-booleano que evalúa a FALSE, como 0 o "". Lea la sección sobre Booleanos para obtener más información sobre . Use el operador === para probando el valor de retorno de esta función .

En cuanto al uso de matrices, strpos está destinado a tomar dos cadenas. El uso de una matriz producirá Warning: strpos() expects parameter 1 to be string, array given o 1 Advertencia: strpos(): la aguja no es una cadena o un número entero ".

Bien, digamos que tiene una matriz de cadenas para buscar.

Puede

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

Otra forma de búsquedas de varias cadenas en una cadena, sin necesidad de utilizar una gran variedad ... Esto sólo le indica si se ha encontrado al menos un partido.

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

O uso preg_match_all para ver cuántos partidos hay, total.

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

En eso, el término de búsqueda es una expresión regular. () agrupa los términos juntos, y | significa 'o'. # denota el comienzo y el final del patrón. Regex puede complicarse bastante rápido, pero por supuesto, ¡funcionan! A menudo se evitan por motivos de rendimiento, pero si está probando varias cadenas, esto podría ser más eficiente que el método de bucle de matriz descrito anteriormente. Estoy seguro de que también hay otras formas de hacerlo.

+0

Ok, bien. Pero, ¿y si estuviera en una matriz? (ver publicación editada). – MacMac

+0

¿Quiere decir que el pajar es una matriz? ¿O la aguja? Echa un vistazo a los documentos PHP - el primer comentario es actualmente 'strpos que acepta una matriz para $ needle' – JAL

+0

Esencialmente tendrás que usar foreach para iterar sobre la matriz, cualquiera que sea. preg_match es una solución viable si tiene muchas 'agujas' y un 'pajar'. – JAL

3

strstr()/stristr() (estando el último caso-insensible)

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

strpos() puede hacer eso.

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

en cuenta que puede devolver 0, por lo que utilizar el tipo es igual operador.

+1

Al probar la existencia, se debe usar una comparación estricta contra el falso ('! == falso'). – BoltClock

+0

Sí, edité mientras daba el voto en baja. Dale unos segundos a un chico, ¿está bien? –

+0

Creo que el que menosprecia votó antes de su edición. Aunque ha sido revocado, aparentemente. No, yo no fui el que votó negativamente :) – BoltClock

Cuestiones relacionadas