Frage

Ich bin eine Kernfunktion der Kohana Bibliothek zu modifizieren, der Text :: auto_p () Funktion.

Die Funktion beschreibt sich selbst als „nl2br () auf Steroiden“. Im Wesentlichen bietet es <br /> einzelne Zeilenumbrüche, aber doppelte Zeilenumbrüche werden mit den <p> Tags umgeben sind.

Die Beschränkung ich es gefunden habe, ist, dass es wird aber <br />s in einem <pre> Elemente. Das schafft Doppel neue Linien, das ist nicht das, was ich will. Ich habe eine Änderung vorgenommen pre-Elemente mit einem regulären Ausdruck zu holen, und einen Rückruf, der die <br /> Streifen aus wird die gut funktioniert.

Doch das Hauptproblem ist, dass ich Code-Beispiele in meinem Text, die auto_p()'d wird, und ich brauche die Vertiefung zu erhalten (zur besseren Lesbarkeit). Leider ist für mich, die Funktionsstreifen führenden und weißen Raum auf Linien Hinter.

Hier ist die regex, die führende Leerzeichen Streifen

$str = preg_replace('~^[ \t]+~m', '', $str);

Ich bin nicht der beste Regex-Guru, aber ich bin mir ziemlich sicher, das sagt „Get führende Leerzeichen und Tabulatoren in denen mindestens ein und ersetzen sie durch eine leere Zeichenfolge ist.“

Ich habe versucht, diese Linie zu entfernen, aber dann wird es <br /> hinzufügen, wo ich sie definitiv nicht will - in einem Fall, ich war wie diese immer Ausgang

<ul><br />
    <li>something</li>
</ul>

Wie kann ich dieses Regex oder Code ändern, nicht Raum Streifen innerhalb eines <pre> Element führt?

Die ursprüngliche Helferfunktion von Kohana ist hier zur Verfügung. (Navigieren Sie zu dem fast unten).

Ich weiß, ich werde ein paar bekommen Typ Antworten ‚einen HTML-Parser verwenden‘ - und während Sie richtig sein kann - der vorhandene Code verwendet einfach regex, und ich würde eine einfachere Lösung bevorzugen (wo ich muss ein nicht enthalten Bibliothek usw.).

Vielen Dank für Ihre Zeit.

War es hilfreich?

Lösung

Hier ist, wie ich es tun würde:

$str = preg_replace(
    '~^[ \t]++(?=(?:[^<]++|<(?!/?+pre\b))*+(?:\z|<pre\b))~im',
    '', $str);

Nach einigen Line-führenden Leerzeichen passenden, scannt die Look-Ahead-grünes Licht für <pre> oder </pre> Tags. Das Fleisch des Look-Ahead ist dieses Bit:

(?:[^<]++|<(?!/?+pre\b))*+

Es entspricht null oder mehr von allem, was nicht eine linke spitze Klammer ist, oder eine linke spitze Klammer, wenn es nicht der Beginn eines <pre> oder </pre>-Tag ist. Der Teil wird passend nur stoppen, wenn er einen <pre> (ausgang) Tag trifft, einen </pre> (Ende)-Tag oder das Ende der Eingabe. Wenn es ein End-Tag ist, dass es aufhört, wissen Sie, Sie in einem <PRE> Elemente sind, so dass Sie nicht wollen, den Ersatz zu tun.

Die possessive Quantoren ('++', '*+' und '?+') sind wesentliche katastrophal Rückzieher . (Ich kann mir nicht helfen: dieser Satz macht mich immer denken, der Resonanzkaskade Szenario von Half-Life .)

Diese Technik geht auch davon aus einigermaßen gut ausgebildet HTML, das heißt, alle <pre>...</pre> Tags richtig ausgeglichen. Tags innerhalb von SGML Kommentare werden mess es auch - es sei denn, sie sich gerade ausgeglichen werden. Sie können mit Kommentaren umgehen, auch wenn Sie die regex machen doppelt so lang und dreimal so hässlich nichts ausmachen. :)

Andere Tipps

Ihr Problem diskutiert wird viel ich denke - diesen Link überprüfen

http://us3.php.net/manual/en /function.nl2br.php#91828

Dies auch:

http://us3.php.net/manual/en /function.nl2br.php#39641

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top