2010-03-27 10 views
5

Solución: strpos resultó ser el más eficiente. Se puede hacer con substr pero eso crea una subcadena temporal. También se puede hacer con expresiones regulares, pero más lento que strpos y no siempre produce la respuesta correcta si la palabra contiene metacaracteres (ver el comentario de Ayman Hourieh).que coincide con una palabra al final de la cadena con strpos

respuesta elegida:

if(strlen($str) - strlen($key) == strrpos($str,$key)) 
    print "$str ends in $key"; // prints Oh, hi O ends in O 

y lo mejor para la prueba de igualdad estricta === (véase David respuesta)

Gracias a todos por su ayuda.


Estoy tratando de hacer coincidir una palabra en una cadena para ver si ocurre al final de esa cadena. El strpos($theString, $theWord); habitual no haría eso.

Básicamente, si $theWord = "my word";

$theString = "hello myword";  //match 
$theString = "myword hello";  //not match 
$theString = "hey myword hello"; //not match 

¿Cuál sería la forma más eficiente de hacerlo?

P.S. En el título dije strpos, pero si existe una manera mejor, está bien también.

+0

¿Qué quieres decir con "palabra"? ¿Texto delimitado por espacios? ¿La tecla "foo" coincidiría con "barfoo" o solo "bar foo"? –

+0

@Nick, si '$ word =" foo ";' entonces ambos '$ sentence =" barfoo "o" bar foo ";' todavía deberían 'coincidir'. No es importante en este caso si tiene un espacio antes o no. – clover

+0

posible duplicado de [¿Cuál es la prueba más eficiente de si una cadena PHP termina con otra cadena?] (Http://stackoverflow.com/questions/619610/whats-the-most-efficient-test-of-whether-a- php-string-ends-with-another-string) – Gajus

Respuesta

5

Puede hacer uso de strrpos función para esto:

$str = "Oh, hi O"; 
$key = "O"; 

if(strlen($str) - strlen($key) == strrpos($str,$key)) 
    print "$str ends in $key"; // prints Oh, hi O ends in O 

o una solución basada en expresiones regulares como:

if(preg_match("#$key$#",$str)) { 
print "$str ends in $key"; // prints Oh, hi O ends in O 
} 
+0

La solución de expresiones regulares no siempre produce resultados correctos. Ver mi comentario sobre la respuesta de @jjclarkson. –

+0

@Ayman, gracias por señalarlo. Actualizará el resumen del hilo. – clover

+0

@Aryam: OP quiere hacer coincidir una palabra, no cualquier cadena. Ahora he asumido que una palabra será alfabética o alfanumérica. Si la palabra puede contener cualquier char de la cual algunos pueden ser regex meta char, esto no funcionará y tendremos que escapar de los metas. – codaddict

0

Puede usar regular expression.

if(preg_match('/'.$theWord.'$/', $theString)) { 
    //matches at the end of the string 
} 

O podría usar strrpos() y agregar la longitud de la palabra. (strrpos - "Buscar la posición de la última aparición de un carácter en una cadena") A continuación, compruebe si esa es la posición del último carácter de la cadena.

+2

No produce la salida correcta si '$ theWord' contiene metacaracteres. Pruébalo con '$ theWord' establecido en' '.'' por ejemplo. –

+0

Muy cierto, definitivamente tendría que validar la palabra y/o escapar de los metacaracteres. – jjclarkson

+0

Probablemente sea más lento que el primer método de codaddict también. –

1

strpos podría ser el más eficiente en algunos casos, sino que también puedes substr con un valor negativo como el segundo parámetro para contar hacia atrás desde el final de la cadena:

$theWord = "my word"; 
$theWordLen = strlen($theWord); 

$theString = "hello myword"; 
$matches = ($theWord ==substr($theString, -1 * $theWordLen); 
+1

La desventaja de este método es que está creando una cadena temporal del resultado "substr". El método strrpos mencionado por codaddict es probablemente más rápido (aunque desearía probar la igualdad estricta). – David

Cuestiones relacionadas