recomendado para máximo líneas las largo instrucciones código cuál caracteres basicas anidados php string performance

para - instrucciones basicas de php



¿Cuál es la prueba más eficiente de si una cadena de PHP termina con otra cadena? (10)

Aquí hay una manera simple de comprobar si una cadena termina con otra, dando a strpos un desplazamiento justo donde se debe encontrar la cadena:

function stringEndsWith($whole, $end) { return (strpos($whole, $end, strlen($whole) - strlen($end)) !== false); }

Directo, y creo que esto funcionará en PHP 4.

La forma estándar de PHP para probar si una cadena $str termina con una subcadena $test es:

$endsWith = substr( $str, -strlen( $test ) ) == $test

¿Es esta la manera más rápida?


Depende del tipo de eficiencia que le interese.

Su versión usa más memoria debido a la copia adicional del uso de substr.

Una versión alternativa puede buscar en la cadena original la última aparición de la subcadena sin hacer una copia, pero probablemente sea más lenta debido a más pruebas.

Probablemente la forma más eficiente es hacer un bucle char-by-char desde la posición -sterlen (prueba) hasta el final de la cadena y comparar. Esa es la cantidad mínima de comparaciones que puede esperar hacer y casi no se usa memoria adicional.


Espero que la respuesta a continuación sea eficiente y también simple:

$content = "The main string to search"; $search = "search"; //For compare the begining string with case insensitive. if(stripos($content, $search) === 0) echo ''Yes''; else echo ''No''; //For compare the begining string with case sensitive. if(strpos($content, $search) === 0) echo ''Yes''; else echo ''No''; //For compare the ending string with case insensitive. if(stripos(strrev($content), strrev($search)) === 0) echo ''Yes''; else echo ''No''; //For compare the ending string with case sensitive. if(strpos(strrev($content), strrev($search)) === 0) echo ''Yes''; else echo ''No'';


Este método es un poco más caro para la memoria, pero es más rápido:

stripos(strrev($haystack), $reversed_needle) === 0;

Esto es mejor cuando sabes exactamente qué es la aguja, por lo que puedes codificarla para que se revierta. Si invierte la aguja de forma programática, se vuelve más lenta que el método anterior.


Esto es puro PHP, sin llamar a funciones externas, a excepción de strlen .

function endsWith ($ends, $string) { $strLength = strlen ($string); $endsLength = strlen ($ends); for ($i = 0; $i < $endsLength; $i++) { if ($string [$strLength - $i - 1] !== $ends [$i]) return false; } return true; }


Estoy pensando que las funciones inversas como strrchr () te ayudarían a unir el final de la cadena más rápido.


Lo que Assaf dijo es correcto. Hay una función incorporada en PHP para hacer exactamente eso.

substr_compare($str, $test, strlen($str)-strlen($test), strlen($test)) === 0;

Si $test es más largo que $str PHP dará una advertencia, por lo que debe verificarlo primero.

function endswith($string, $test) { $strlen = strlen($string); $testlen = strlen($test); if ($testlen > $strlen) return false; return substr_compare($string, $test, $strlen - $testlen, $testlen) === 0; }


No sé si esto es rápido o no, pero para una prueba de un solo carácter, estos trabajos también:

(array_pop(str_split($string)) === $test) ? true : false; ($string[strlen($string)-1] === $test) ? true : false; (strrev($string)[0] === $test) ? true : false;


Otra forma sería usar la función strrpos :

strrpos($str, $test) == strlen($str) - strlen($test)

Pero eso no es más rápido.


$endsWith = substr_compare( $str, $test, -strlen( $test ) ) === 0

El desplazamiento negativo "comienza a contar desde el final de la cuerda".