webentwicklung-frage-antwort-db.com.de

Was ist der effizienteste Test, ob a PHP String endet mit einem anderen String?

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?

113
Jason Cohen

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;
}
139
mcrumley

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. 

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

Negativer Offset beginnt ab dem Ende der Zeichenfolge zu zählen.

45

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.

11
Patrick Smith

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.

8
Assaf Lavie

Eine andere Möglichkeit wäre die Verwendung der strrpos-Funktion :

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

Das geht aber nicht schneller.

4
Gumbo

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';
2
Srinivasan.S

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;
1
wloske

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';
0

Ich denke, die umgekehrten Funktionen wie strrchr () würden Ihnen helfen, das Ende der Zeichenfolge am schnellsten zu finden.

0
tkotitan