Ich bin schrecklich mit regulären Ausdrücken. Ich versuche dies zu ersetzen:
public static function camelize($word) {
return preg_replace('/(^|_)([a-z])/e', 'strtoupper("\\2")', $word);
}
mit preg_replace_callback mit einer anonymen Funktion. Ich verstehe nicht, was die \\ 2 macht. Oder genau so, wie preg_replace_callback funktioniert.
Was wäre der richtige Code, um dies zu erreichen?
preg_replace_callback
. Und\\2
wird$matches[2]
in besagtem Rückruf. Oder über welchen Teil sind Sie konkret verwirrt?create_function
, es ist nur ein weiterer Wrappereval
. Sie sollten eine ordnungsgemäße anonyme Funktion verwenden, es sei denn, Sie stecken aus irgendeinem Grund in PHP 5.2 fest.Antworten:
In einem regulären Ausdruck können Sie Teile der übereinstimmenden Zeichenfolge mit "erfassen"
(brackets)
. In diesem Fall erfassen Sie die(^|_)
und([a-z])
Teile des Spiels. Diese sind ab 1 nummeriert, sodass Sie die Rückverweise 1 und 2 haben. Match 0 ist die gesamte übereinstimmende Zeichenfolge.Der
/e
Modifikator verwendet eine Ersatzzeichenfolge und ersetzt den Backslash gefolgt von einer Zahl (z. B.\1
) durch die entsprechende Backreferenz. Da Sie sich jedoch in einer Zeichenfolge befinden, müssen Sie den Backslash umgehen, damit Sie erhalten'\\1'
. Es wird dann (effektiv) ausgeführteval
, um die resultierende Zeichenfolge so auszuführen, als wäre es PHP-Code (weshalb sie veraltet ist, weil sie aufeval
unsichere Weise einfach zu verwenden ist ).Die
preg_replace_callback
Funktion verwendet stattdessen eine Rückruffunktion und übergibt ihr ein Array mit den übereinstimmenden Rückverweisen. Wo Sie also geschrieben hätten'\\1'
, greifen Sie stattdessen auf Element 1 dieses Parameters zu - z. B. wenn Sie eine anonyme Funktion des Formulars habenfunction($matches) { ... }
, befindet sich die erste Rückreferenz$matches[1]
innerhalb dieser Funktion.Also ein
/e
Argument vonkönnte ein Rückruf von werden
Oder in deinem Fall
könnte werden
Beachten Sie, dass
$m
und$matches
sind nicht magische Namen, sie sind nur die Parameternamen gab ich als meine Callback - Funktionen zu deklarieren. Außerdem müssen Sie keine anonyme Funktion übergeben, es kann sich um einen Funktionsnamen als Zeichenfolge oder um etwas in der Form handelnarray($object, $method)
, wie bei jedem Rückruf in PHP , zWie bei jeder Funktion können Sie standardmäßig nicht auf Variablen außerhalb Ihres Rückrufs (aus dem umgebenden Bereich) zugreifen. Wenn Sie eine anonyme Funktion verwenden, können Sie das
use
Schlüsselwort verwenden, um die Variablen zu importieren, auf die Sie zugreifen müssen, wie im PHP-Handbuch beschrieben . zB wenn das alte Argument wardann könnte der neue Rückruf so aussehen
Fallstricke
preg_replace_callback
ist statt dem/e
Modifikator auf dem regulären Ausdruck, so dass Sie die Flagge von Ihrem „Muster“ Argumente entfernen müssen. So würde ein Muster wie/blah(.*)blah/mei
werden/blah(.*)blah/mi
./e
Modifikator verwendete eine Variante vonaddslashes()
intern für die Argumente, daher wurden einige Ersetzungen verwendetstripslashes()
, um sie zu entfernen. In den meisten Fällen möchten Sie den Anruf wahrscheinlichstripslashes
aus Ihrem neuen Rückruf entfernen .quelle
preg_replace shim mit eval support
Dies ist sehr nicht ratsam. Aber wenn Sie kein Programmierer sind oder wirklich schrecklichen Code bevorzugen, können Sie eine Ersatzfunktion
preg_replace
verwenden, um Ihre/e
Flagge vorübergehend funktionsfähig zu halten .Im Wesentlichen fügen Sie diese Funktion einfach in Ihre Codebasis ein und bearbeiten
preg_replace
siepreg_replace_eval
dort , wo das/e
Flag verwendet wurde.Vor- und Nachteile :
preg_replace_callback
.Ersatzcode-Generator
Das ist jetzt etwas überflüssig. Könnte aber den Benutzern helfen, die immer noch mit der manuellen Umstrukturierung ihres Codes überfordert sind
preg_replace_callback
. Während dies effektiv zeitaufwändiger ist, hat ein Codegenerator weniger Probleme, die/e
Ersatzzeichenfolge in einen Ausdruck zu erweitern. Es ist eine sehr unauffällige Konvertierung, die aber wahrscheinlich für die am weitesten verbreiteten Beispiele ausreicht.Um diese Funktion zu verwenden, bearbeiten Sie einen unterbrochenen
preg_replace
Anruf inpreg_replace_eval_replacement
und führen Sie ihn einmal aus . Dies wird auszudrucken den entsprechendenpreg_replace_callback
Block an seiner Stelle verwendet werden.Denken Sie daran, dass das bloße Kopieren und Einfügen keine Programmierung ist. Sie müssen den generierten Code wieder an die tatsächlichen Namen der Eingabe- / Ausgabevariablen oder den Verwendungskontext anpassen.
$OUTPUT =
müsste die Zuweisung gehen, wenn der vorherigepreg_replace
Anruf in einem verwendet wurdeif
.Und der Ersatzausdruck erfordert möglicherweise mehr Verbesserungen der Lesbarkeit oder Nacharbeit.
stripslashes()
wird es in wörtlichen Ausdrücken häufig überflüssig.use
oder eineglobal
Referenz für / innerhalb des Rückrufs erforderlich ."-$1-$2"
Erfassungsreferenzen werden durch die einfache Umwandlung in syntaktisch unterbrochen"-$m[1]-$m[2]
.Die Code-Ausgabe ist lediglich ein Ausgangspunkt. Und ja, dies wäre als Online-Tool nützlicher gewesen. Dieser Ansatz zum Umschreiben von Code (Bearbeiten, Ausführen, Bearbeiten, Bearbeiten) ist etwas unpraktisch. Könnte jedoch für diejenigen zugänglicher sein, die an aufgabenorientiertes Codieren gewöhnt sind (mehr Schritte, mehr Aufdeckungen). Diese Alternative könnte also einige weitere doppelte Fragen zügeln.
quelle
Sie sollten kein Flag
e
(odereval
allgemein) verwenden.Sie können auch die T-Regx-Bibliothek verwenden
quelle