Ich arbeite an einer großen PHP-Anwendung (& gt; 1 Million Zeilen, 10 Jahre alt), die ereg
und ereg_replace
- aktuell 1.768 eindeutige reguläre Ausdrücke in 516 Klassen ausgiebig verwendet.
Ich bin mir sehr bewusst, warum ereg
veraltet ist, aber eine deutliche Migration zu preg
könnte sehr stark sein.
Weiß jemand, wie lange ereg
support wahrscheinlich in PHP beibehalten wird, und / oder haben Sie einen Ratschlag für die Migration zu preg
in diesem Umfang. Ich vermute, automatisierte Übersetzung von EREG zu Preg ist unmöglich / unpraktisch?
Ich bin mir nicht sicher, ob ereg
entfernt wird, aber meine Wette ist ab PHP 6.0.
Was Ihr zweites Problem anbelangt (Übersetzung von ereg
in preg
) scheint nicht so schwer zu sein, wenn Ihre Anwendung & gt; 1 Million Zeilen sicher müssen Sie die Mittel haben, um jemanden zu bekommen, der diesen Job für höchstens eine Woche macht. Ich würde alle ereg_
Instanzen in Ihrem Code grep und einige Makros in Ihrer bevorzugten IDE einrichten (einfache Sachen wie das Hinzufügen von Trennzeichen, Modifikatoren und so weiter).
Ich wette, dass die meisten der 1768 Regexes mit einem Makro portiert werden können, und die anderen, naja, ein gutes Paar Augen.
Eine andere Möglichkeit könnte sein, Wrapper um die Funktionen ereg
zu schreiben, wenn diese nicht verfügbar sind, indem die Änderungen nach Bedarf:
Sie bekommen die Idee. Auch das PEAR-Paket PHP Compat könnte eine praktikable Lösung sein.
Unterschiede zu POSIX Regex
Ab PHP 5.3.0 der POSIX Regex Erweiterung ist veraltet. Es gibt a Anzahl der Unterschiede zwischen POSIX Regex und PCRE Regex. Diese Seite listet auf die bemerkenswertesten, die sind notwendig, um beim Konvertieren zu wissen PCRE.
- Die PCRE-Funktionen erfordern, dass das Muster durch Trennzeichen eingeschlossen ist.
- Im Gegensatz zu POSIX verfügt die Erweiterung PCRE nicht über dedizierte Funktionen für Groß- / Kleinschreibung nicht beachten. Stattdessen, Dies wird unter Verwendung des / i-Musters unterstützt Modifikator. Andere Mustermodifikatoren sind auch verfügbar zum Ändern der passende Strategie.
- Die POSIX-Funktionen finden die längste der am weitesten links liegenden Übereinstimmung, aber PCRE stoppt bei der ersten gültigen Übereinstimmung. Wenn die Zeichenfolge überhaupt nicht übereinstimmt macht keinen Unterschied, aber wenn es übereinstimmt es kann dramatische Auswirkungen auf beide haben die resultierende Übereinstimmung und die Übereinstimmung Geschwindigkeit. Um diesen Unterschied zu veranschaulichen, Betrachte das folgende Beispiel von "Reguläre Ausdrücke beherrschen" von Jeffrey Friedl. Verwenden des Musters eins (selbst)? (selbstgenügsam)? auf der string selbst mit PCRE wird dazu führen, sich selbst anzupassen, aber mit POSIX wird das Ergebnis das sein vollständige Zeichenfolge selbst ausreichend. Beide (Unter) Zeichenketten entsprechen dem Original Zeichenfolge, aber POSIX erfordert, dass die Am längsten sei das Ergebnis.
Meine Intuition sagt, dass sie ereg
nicht absichtlich entfernen werden. PHP unterstützt immer noch wirklich alte und veraltete Sachen wie register globals. Es sind einfach zu viele veraltete Apps da draußen. Es gibt jedoch eine kleine Chance, dass die Erweiterung entfernt werden muss, weil jemand eine ernsthafte Sicherheitslücke findet und es niemanden gibt, der es reparieren kann.
Auf jeden Fall ist es erwähnenswert:
Sie sind nicht gezwungen, Ihre PHP-Installation zu aktualisieren. Es ist ziemlich üblich, dass veraltete Server legady Apps laufen lassen.
Das PHP_Compat PEAR-Paket bietet eine einfache PHP-Version einiger nativer Funktionen. Wenn ereg
verschwindet, ist es möglich, dass es hinzugefügt wird.
BTW ... Tatsächlich PHP 6 ist tot . Sie stellten fest, dass ihr Ansatz, PHP vollständig Unicode-kompatibel zu machen, schwieriger war, als sie dachten, und sie überdenken alles. Die Schlussfolgerung ist: Sie können niemals perfekte Vorhersagen treffen.
Ich hatte dieses Problem in einem viel kleineren Maßstab - eine Anwendung mehr als 10.000 Zeilen. In jedem Fall musste ich nur zu preg_replace()
wechseln und Trennzeichen um das Regex-Muster setzen.
Jeder sollte das können - selbst ein Nicht-Programmierer kann eine Liste von Dateinamen und Zeilennummern erhalten.
Führen Sie dann einfach Ihre Tests aus, um nach Fehlern zu suchen, die behoben werden können.
ereg-Funktionen werden übrigens aus PHP6 entfernt - Ссылка .