Eine der Zeilen in meinem Skript enthält ein PHP-Abschluss-Tag in einer Zeichenfolge. Im normalen Betrieb verursacht dies kein Problem, aber ich muss die Zeile auskommentieren.
Ich habe versucht , mit dieser Zeile auszukommen //
, /*
*/
und #
aber keiner von ihnen zu arbeiten, hält die Parser - Tag einen tatsächlicher End - Tag zu sein , zu schließen.
Hier ist die fragliche Zeile:
$string = preg_replace('#<br\s*/?>(?:\s*<br\s*/?>)+#i', '<br />', $string);
// ^^ ^^
Was kann ich tun, um die obige Zeile zu kommentieren?
<?php # echo 'simple';?>
.Antworten:
Verwenden Sie einen Trick: Verketten Sie die Zeichenfolge aus zwei Teilen. Auf diese Weise wird das schließende Tag in zwei Teile geteilt und ist kein gültiges schließendes Tag mehr.
'?>' --> '?'.'>'
In Ihrem Code:
Dadurch
//
funktionieren Kommentare.Damit
/* */
Kommentare funktionieren, müssen Sie auch die*/
Sequenz aufteilen :Denken Sie manchmal daran, dass das Ganze mehr ist als die Summe seiner Teile - aber gierig zu sein ist schlecht, es gibt Zeiten, in denen Sie besser weniger haben . :) :)
quelle
??<
Der einfachste Weg
Erstellen Sie eine separate Variable für Ihren regulären Ausdruck. Auf diese Weise können Sie die
preg_replace()
Aussage einfach auskommentieren :Fix mit Zeichenklassen
Um Zeilenkommentare zu korrigieren, können Sie sich trennen,
?>
indem Sie>
eine Zeichenklasse wie folgt eingeben :Um Blockkommentare zu korrigieren, können Sie sie anwenden auf
/
:Um beiden Kommentarstile zu beheben, können Sie setzen
/
und>
ihre eigenen Charakterklasse in.Fix mit dem
/x
ModifikatorDer
x
Modifikator - auch bekannt alsPCRE_EXTENDED
- ignoriert Leerzeichen und Zeilenumbrüche in einem regulären Ausdruck (außer wenn sie innerhalb einer Zeichenklasse vorkommen). Dies ermöglicht das Hinzufügen von Leerzeichen, um die problematischen Zeichen zu trennen. So korrigieren Sie beide Kommentarstile:quelle
x
Modifikator verwendet habe :)g
) ...Warum Ihre Versuche nicht funktionierten:
Was funktioniert:
Des Weiteren...
Nach dem oben Gesagten sollten Sie in der Lage sein
/*
, die Zeile zu kommentieren. Wenn Sie das?>
intakt lassen,//
können Sie möglicherweise nicht eine ganze Zeile auskommentieren. Der folgende Text?>
könnte HTML sein, der außerhalb der Kontrolle des PHP-Interpreters liegt, sodass dies nicht funktioniert.Aus der Dokumentation:
quelle
Eine andere Idee: Escape the
>
(und die/
, wenn Sie einen/*...*/
Kommentar verwenden möchten ):Ein "unnötiges" Escape wird von der Regex-Engine ignoriert, ist jedoch in diesem Fall nützlich (aus Gründen, die in den anderen Antworten aufgeführt sind).
quelle
Warum komplizierte, schwer zu lesende "Tricks" verwenden, um das Problem zu umgehen?
?
ist nur eine Abkürzung für den QuantifiziererVerwenden Sie einfach die lange Version des Quantifizierers
{0,1}
, was "Minimum 0 Maximum 1 Vorkommen" bedeutet:quelle
Einige andere Möglichkeiten, die es wert sind, in das RegEx-Trickbuch aufgenommen zu werden :
Zuerst können Sie Ihren RegEx komprimieren, um:
/(<br\s*/?>)+/i
und durch zu ersetzen<br />
(Sie müssen den RegExP nicht mit Lookaheads belasten), und Sie erhalten immer den von Ihnen gewählten XHMTL-Zeilenumbruch.Andere Möglichkeiten, Ihr RegEx so zu ändern, dass es keinen
*/
Endkommentar oder Endskript auslöst?>
:#(<br\s*+/?+>)+#i
- was im Grunde bedeutet,\s*+
wenn Sie festgestellt haben, dass Leerzeichen mit so vielen übereinstimmen, wie es gibt, und behalten Sie es, und/?+
wenn Sie einen Schrägstrich gefunden haben, behalten Sie es!\s*
und/*
in Erfassungsgruppen =>#(<br(\s*)(/?)>)+#i
Live-Demos: http://codepad.viper-7.com/YjqUbi
Und da wir uns auf das besitzergreifende Verhalten gestützt haben, ist das schnellste RegEx, das auch das Kommentarproblem umgeht, die erklärte Demo
#(<br\s*+/?+>)++#i
Wie zum Kommentieren in schwierigen Situationen
Wenn Sie den Code nicht ändern können oder bereits einen mehrzeiligen Kommentar verwendet haben und:
1. Verwenden Sie einen Nowdoc :
Live-Code: http://codepad.viper-7.com/22uOtV
Hinweis: a Nowdoc ähnelt einem heredoc aber nicht den Inhalt analysieren und hat es zu haben ist Anlaßtrennzeichen in geschlossenen
'
Apostrophe'
( beachten Sie, dass die Endbegrenzer kann nicht eingerückt werden , müssen befolgt werden;
und eine neue Linie ! )2. Springe mit einem goto über den Code :
Live-Beispiel: http://codepad.viper-7.com/UfqrIQ
3. Überspringen Sie den Code mit
if(false)
oderif(0)
:Test: http://codepad.viper-7.com/wDg5H5
quelle