Die Standardmethode PHP zum Testen, ob eine Zeichenfolge $str
mit einer Teilzeichenfolge $test
endet, lautet:
$endsWith = substr( $str, -strlen( $test ) ) == $test
Ist das der schnellste Weg?
Was Assaf gesagt hat, ist richtig. Es gibt eine eingebaute Funktion in PHP, die genau das tut.
substr_compare($str, $test, strlen($str)-strlen($test), strlen($test)) === 0;
Wenn $test
länger ist als $str
PHP, wird eine Warnung ausgegeben, daher müssen Sie zuerst nachsehen.
function endswith($string, $test) {
$strlen = strlen($string);
$testlen = strlen($test);
if ($testlen > $strlen) return false;
return substr_compare($string, $test, $strlen - $testlen, $testlen) === 0;
}
Diese Methode ist zwar etwas speicherintensiver, aber schneller:
stripos(strrev($haystack), $reversed_needle) === 0;
Dies ist am besten, wenn Sie genau wissen, was die Nadel ist, damit Sie sie hart codieren können. Wenn Sie die Nadel programmatisch umkehren, wird sie langsamer als bei der vorherigen Methode.
$endsWith = substr_compare( $str, $test, -strlen( $test ) ) === 0
Negativer Offset beginnt ab dem Ende der Zeichenfolge zu zählen.
Hier können Sie auf einfache Weise prüfen, ob eine Zeichenfolge mit einer anderen endet, indem Sie strpos
einen Versatz nach rechts geben, wo die Zeichenfolge gefunden werden soll:
function stringEndsWith($whole, $end)
{
return (strpos($whole, $end, strlen($whole) - strlen($end)) !== false);
}
Unkompliziert, und ich denke, das funktioniert in PHP 4.
Es hängt davon ab, um welche Art von Effizienz Sie sich kümmern.
Ihre Version benötigt mehr Speicherplatz, da durch die zusätzliche Verwendung von substr zusätzliche Kopien erstellt wurden.
Bei einer alternativen Version wird die ursprüngliche Zeichenfolge möglicherweise nach dem letzten Vorkommen der Teilzeichenfolge durchsucht, ohne dass eine Kopie erstellt wird. Dies ist jedoch aufgrund weiterer Tests wahrscheinlich langsamer.
Der effizienteste Weg ist wahrscheinlich, char-by-char von der Position -sterlen (test) bis zum Ende des Strings zu schleifen und zu vergleichen. Das ist die minimale Anzahl von Vergleichen, die Sie hoffen können, und es wird kaum zusätzlicher Speicherplatz benötigt.
Eine andere Möglichkeit wäre die Verwendung der strrpos
-Funktion :
strrpos($str, $test) == strlen($str) - strlen($test)
Das geht aber nicht schneller.
Ich hoffe, dass die folgende Antwort effizient und auch einfach sein kann:
$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';
Ich weiß nicht, ob das schnell ist oder nicht, aber für einen einzelnen Charaktertest funktionieren auch diese:
(array_pop(str_split($string)) === $test) ? true : false;
($string[strlen($string)-1] === $test) ? true : false;
(strrev($string)[0] === $test) ? true : false;
am einfachsten lässt sich das über einen regulären Ausdruck überprüfen
zum Beispiel um zu überprüfen, ob es sich bei der angegebenen Mail um gmail handelt:
echo (preg_match("/@gmail\.com$/","[email protected]"))?'true':'false';
Ich denke, die umgekehrten Funktionen wie strrchr () würden Ihnen helfen, das Ende der Zeichenfolge am schnellsten zu finden.