Considerar:
$a = 'How are you?';
if ($a contains 'are')
echo 'true';
Supongamos que tengo el código anterior, ¿cuál es la forma correcta de escribir la declaración if ($a contains 'are')
?
Puede usar la strpos()
función que se usa para encontrar la aparición de una cadena dentro de otra:
$a = 'How are you?';
if (strpos($a, 'are') !== false) {
echo 'true';
}
Tenga en cuenta que el uso de !== false
es deliberado ( != false
ni === true
devolverá el resultado deseado); strpos()
devuelve el desplazamiento en el que comienza la secuencia de agujas en la secuencia de pajar o el valor booleano false
si no se encuentra la aguja. Como 0 es un desplazamiento válido y 0 es "falsey", no podemos usar construcciones más simples como !strpos($a, 'are')
.
strpos($a, 'are') > -1
para probar si es verdadero. Desde una perspectiva de depuración, encuentro que mi cerebro desperdicia menos ciclos de reloj para determinar si la línea está escrita correctamente cuando no tengo que contar signos iguales contiguos.Puede usar expresiones regulares, es mejor para la coincidencia de palabras en comparación con
strpos
lo mencionado por otros usuarios, también devolverá verdadero para cadenas como tarifa, cuidado, mirada fija, etc. Esto simplemente se puede evitar en la expresión regular mediante el uso de límites de palabras.Una coincidencia simple para se podría ver más o menos así:
Por el lado del rendimiento,
strpos
es aproximadamente tres veces más rápido y tenga en cuenta que cuando hice un millón de comparaciones a la vez, tardépreg_match
1.5 segundos en terminar y parastrpos
0.5 segundos.Editar: para buscar cualquier parte de la cadena, no solo palabra por palabra, recomendaría usar una expresión regular como
El
i
final de la expresión regular cambia la expresión regular para que no distinga entre mayúsculas y minúsculas, si no lo desea, puede omitirlo.Ahora, esto puede ser bastante problemático en algunos casos ya que la cadena de búsqueda $ no está desinfectada de ninguna manera, es decir, puede que no pase la verificación en algunos casos, ya que si
$search
es una entrada del usuario, pueden agregar alguna cadena que podría comportarse como alguna expresión regular diferente ...Además, aquí hay una gran herramienta para probar y ver explicaciones de varias expresiones regulares Regex101
Para combinar ambos conjuntos de funciones en una sola función multipropósito (incluso con mayúsculas y minúsculas seleccionables), puede usar algo como esto:
fuente
Aquí hay una pequeña función de utilidad que es útil en situaciones como esta
fuente
if ($email->contains("@") && $email->endsWith(".com)) { ...
oif (strpos($email, "@") !== false && substr($email, -strlen(".com")) == ".com") { ...
Si bien la mayoría de estas respuestas le dirán si aparece una subcadena en su cadena, eso generalmente no es lo que desea si está buscando una palabra en particular , y no una subcadena .
¿Cual es la diferencia? Las subcadenas pueden aparecer en otras palabras:
Una forma de mitigar esto sería usar una expresión regular junto con límites de palabras (
\b
):Este método no tiene los mismos falsos positivos mencionados anteriormente, pero tiene algunos casos extremos propios. Límites de las palabras coinciden en caracteres que no son de texto (
\W
), que van a ser cualquier cosa que no esa-z
,A-Z
,0-9
, o_
. Eso significa que los dígitos y los guiones bajos se contarán como caracteres de palabras y escenarios como este fallarán:Si desea algo más preciso que esto, tendrá que comenzar a analizar la sintaxis del idioma inglés, y esa es una lata bastante grande de gusanos (y supone un uso adecuado de la sintaxis, lo cual no siempre es un hecho).
fuente
\b
coincide con dos cosas que\W
no lo hacen, lo que lo hace ideal para encontrar palabras en una cadena: coincide con el comienzo de la cadena (^
) y el final de la cadena ($
)Para determinar si una cadena contiene otra cadena, puede usar la función PHP strpos () .
int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )
PRECAUCIÓN:
Si la aguja que está buscando está al comienzo del pajar, volverá a la posición 0, si realiza una
==
comparación que no funcionará, deberá hacer un===
Un
==
signo es una comparación y prueba si la variable / expresión / constante a la izquierda tiene el mismo valor que la variable / expresión / constante a la derecha.Un
===
signo es una comparación para ver si dos variables / expresiones / constantes son igualesAND
tienen el mismo tipo, es decir, ambas son cadenas o ambas son enteros.fuente
Mira
strpos()
:fuente
Usar
strstr()
ostristr()
si su búsqueda no distingue entre mayúsculas y minúsculas sería otra opción.fuente
strstr($a, 'are')
es mucho más elegante que lo feostrpos($a, 'are') !== false
. PHP realmente necesita unastr_contains()
función.Utilice la coincidencia entre mayúsculas y minúsculas utilizando
stripos()
:fuente
Mira los comentarios de SamGoody y Lego Stormtroopr.
Si está buscando un algoritmo PHP para clasificar los resultados de búsqueda en función de la proximidad / relevancia de varias palabras, aquí viene una manera rápida y fácil de generar resultados de búsqueda solo con PHP:
Problemas con los otros métodos de búsqueda booleana como
strpos()
,preg_match()
,strstr()
ostristr()
Método PHP basado en el modelo de espacio vectorial y tf-idf (término frecuencia-frecuencia de documento inversa):
Suena difícil pero es sorprendentemente fácil.
Si queremos buscar varias palabras en una cadena, el problema central es cómo asignamos un peso a cada una de ellas.
Si pudiéramos ponderar los términos en una cadena en función de cuán representativos son de la cadena en su conjunto, podríamos ordenar nuestros resultados por los que mejor coincidan con la consulta.
Esta es la idea del modelo de espacio vectorial, no muy lejos de cómo funciona la búsqueda de texto completo de SQL:
CASO 1
RESULTADO
CASO 2
RESULTADOS
CASO 3
RESULTADOS
Hay un montón de mejoras a realizar, pero el modelo proporciona una manera de conseguir buenos resultados de las consultas naturales, que no tienen los operadores booleanos tales como
strpos()
,preg_match()
,strstr()
ostristr()
.NOTA BENE
Opcionalmente eliminando la redundancia antes de buscar las palabras
reduciendo así el tamaño del índice y resultando en un menor requerimiento de almacenamiento
menos E / S de disco
indexación más rápida y consecuentemente una búsqueda más rápida.
1. Normalización
2. Eliminación de palabras vacías
3. Sustitución del diccionario
Reemplace las palabras con otras que tengan un significado idéntico o similar. (por ejemplo: reemplace las instancias de 'hambriento' y 'hambriento' con 'hambre')
Se pueden realizar otras medidas algorítmicas (bola de nieve) para reducir aún más las palabras a su significado esencial.
La sustitución de nombres de colores con sus equivalentes hexadecimales
La reducción de valores numéricos al reducir la precisión son otras formas de normalizar el texto.
RECURSOS
fuente
Si desea evitar el problema "falsey" y "verdadero", puede usar substr_count:
Es un poco más lento que strpos pero evita los problemas de comparación.
fuente
false
para "¿estás seguro?" ya que la posición parastrpos
es0
Otra opción es usar la función strstr () . Algo como:
Punto a tener en cuenta: la función strstr () distingue entre mayúsculas y minúsculas. Para una búsqueda que no distingue entre mayúsculas y minúsculas, use la función stristr () .
fuente
fuente
WARNING preg_match(): Delimiter must not be alphanumeric or backslash
Estoy un poco impresionado de que ninguna de las respuestas que usé aquí
strpos
,strstr
y funciones similares mencionen las funciones de cadena multibyte todavía (2015-05-08).Básicamente, si tiene problemas para encontrar palabras con caracteres específicos de algunos idiomas , como alemán, francés, portugués, español, etc. (por ejemplo: ä , é , ô , ç , º , ñ ), es posible que desee preceder las funciones con
mb_
. Por lo tanto, la respuesta aceptada usaríamb_strpos
omb_stripos
(para la coincidencia entre mayúsculas y minúsculas) en su lugar:Si no puede garantizar que todos sus datos estén al 100% en UTF-8 , puede utilizar las
mb_
funciones.Un buen artículo para entender por qué es El mínimo absoluto que todo desarrollador de software debe saber absolutamente, positivamente sobre Unicode y los conjuntos de caracteres (¡Sin excusas!) Por Joel Spolsky .
fuente
En PHP, la mejor manera de verificar si una cadena contiene una determinada subcadena es usar una función auxiliar simple como esta:
Explicación:
strpos
encuentra la posición de la primera aparición de una subcadena sensible a mayúsculas y minúsculas en una cadena.stripos
encuentra la posición de la primera aparición de una subcadena insensible a mayúsculas y minúsculas en una cadena.myFunction($haystack, $needle) === FALSE ? FALSE : TRUE
garantiza quemyFunction
siempre devuelve un valor booleano y corrige un comportamiento inesperado cuando el índice de la subcadena es 0.$caseSensitive ? A : B
selecciona ya seastrpos
ostripos
para hacer el trabajo, dependiendo del valor de$caseSensitive
.Salida:
fuente
La siguiente función también funciona y no depende de ninguna otra función; usa solo manipulación de cadenas PHP nativas. Personalmente, no recomiendo esto, pero puedes ver cómo funciona:
Prueba:
fuente
Puedes usar la
strstr
función:Sin usar una función incorporada:
fuente
Tuve algunos problemas con esto y finalmente elegí crear mi propia solución. Sin usar el motor de expresión regular :
Puede notar que las soluciones anteriores no son una respuesta para la palabra que se usa como prefijo para otra. Para usar su ejemplo:
Con los ejemplos anteriores, ambos
$a
y$b
contiene$c
, pero es posible que desee que su función le diga que solo$a
contiene$c
.fuente
$found = false
al principioOtra opción para encontrar la aparición de una palabra de una cadena usando strstr () y stristr () es la siguiente:
fuente
i
enstristr
significa insensible.Muchas respuestas que usan
substr_count
cheques si el resultado es>0
. Pero como laif
declaración considera cero igual a falso , puede evitar ese cheque y escribir directamente:Para verificar si no está presente, agregue el
!
operador:fuente
Se puede hacer de tres maneras diferentes:
1- stristr ()
2- strpos ()
3- preg_match ()
fuente
La versión abreviada
fuente
Para encontrar una 'palabra', en lugar de la aparición de una serie de letras que de hecho podrían ser parte de otra palabra, lo siguiente sería una buena solución.
fuente
$string
esAre are, are?
Debe usar el formato de mayúsculas y minúsculas, por lo que si el valor ingresado está en
small
ocaps
no importará.Aquí stripos encuentra la aguja en el heystack sin considerar el caso (pequeño / tapas).
PHPCode Muestra con salida
fuente
Tal vez podrías usar algo como esto:
fuente
No lo use
preg_match()
si solo desea verificar si una cadena está contenida en otra cadena. Usestrpos()
o en sustrstr()
lugar ya que serán más rápidos. ( http://in2.php.net/preg_match )fuente
Si desea verificar si la cadena contiene varias palabras específicas, puede hacer:
Esto es útil para evitar el spam cuando se envían correos electrónicos, por ejemplo.
fuente
La función strpos funciona bien, pero si desea
case-insensitive
verificar una palabra en un párrafo, puede utilizar lastripos
función dePHP
.Por ejemplo,
Encuentre la posición de la primera aparición de una subcadena insensible a mayúsculas y minúsculas en una cadena.
Si la palabra no existe en la cadena, devolverá falso, de lo contrario devolverá la posición de la palabra.
fuente
Debe usar operadores idénticos / no idénticos porque strpos puede devolver 0 como su valor de índice. Si le gustan los operadores ternarios, considere usar lo siguiente (parece un poco al revés, lo admito):
fuente
Esto significa que la cadena debe resolverse en palabras (vea la nota a continuación).
Una forma de hacer esto y especificar los separadores es usar
preg_split
( doc ):Una carrera da
Nota: Aquí no queremos decir palabra para cada secuencia de símbolos.
Una definición práctica de palabra es, en el sentido, el motor de expresión regular PCRE, donde las palabras son subcadenas que consisten solo en caracteres de palabras, separadas por caracteres que no son palabras.
fuente
Otra solución para una cadena específica:
También puedes usar la
strpos()
función.fuente