4 Stimmen

Der effizienteste Weg, um eine Zeichenfolge mit preg_replace abzuschneiden?

Ich habe mir etwas Code angeschaut und angefangen, über den effizientesten Weg nachzudenken, eine Zeichenfolge (in diesem Fall einen URI) abzuschneiden, indem ich preg_replace .

Zunächst einmal ist mir klar, dass die Verwendung von preg_replace für diese Aufgabe zu viel sein könnte, dass es unnötig teuer sein könnte und dass es besser ist, die String-freundlichen Funktionen von PHP zu verwenden, wie z.B. substr . Ich weiß dies.

Betrachten Sie nun diese beiden unterschiedlichen regulären Ausdrücke:

$uri = '/one/cool/uri';    // Desired result '/one/cool'

// Using a back-reference
$parent = preg_replace('#(.*)/.*#', "$1", $uri);

// Using character class negation
$parent = preg_replace('#/[^/]+$#', '', $uri);

Standardmäßig würde ich davon ausgehen, dass im ersten Fall die Erstellung des Rückverweises teurer ist als der Verzicht darauf, so dass das zweite Beispiel vorzuziehen wäre. Aber dann begann ich mich zu fragen, ob die Verwendung von [^/] im 2. Beispiel könnte teurer sein als die entsprechende . im ersten Beispiel, und wenn ja, wie viel mehr?

Ich bevorzuge das erste Beispiel unter dem Gesichtspunkt der Lesbarkeit, und da wir gerade dabei sind, Haare zu spalten, neige ich dazu, es zwischen den beiden zu wählen (schließlich ist es auch wertvoll, lesbaren Code zu schreiben). Kann aber auch nur meine persönliche Vorliebe sein.

Was denken Sie?

2voto

Niloct Punkte 8851

Ich würde auch die Laufzeit der beiden Optionen messen. Diese Informationen aus den Dokumenten können ebenfalls hilfreich sein:

http://www.php.net/manual/en/regexp.reference.performance.php

Wenn Sie ein solches Muster mit Betreff-Zeichenfolgen verwenden, die keine Zeilenumbrüche enthalten, erzielen Sie die beste Leistung, wenn Sie PCRE_DOTALL einstellen oder das Muster mit ^.* beginnen, um eine explizite Verankerung anzuzeigen. Das erspart PCRE die Suche nach einem Zeilenumbruch, an dem es neu beginnen muss.

Also, $parent = preg_replace('#^(.*)/.*#s', "$1", $uri); kann die erste Option beschleunigen. Die zweite Option würde diese Einrichtung nicht benötigen:

s (PCRE_DOTALL)

Wenn dieser Modifikator gesetzt ist, wird ein Punktmetach Muster auf alle Zeichen, einschließlich Zeilenumbrüche. Ohne ihn, werden Zeilenumbrüche ausgeschlossen. Dieser Modifikator ist äquivalent zu Perls /s Modifikator. Eine negative Klasse wie [^a] entspricht immer einem Zeilenumbruch Zeichen unabhängig von der Einstellung dieses Modifikators.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X