Question

Je suis en train de modifier une fonction de base de la bibliothèque Kohana, le texte :: auto_p () fonction.

La fonction se décrit comme « nl2br () sur les stéroïdes ». Pour l'essentiel, il fournit des sauts de ligne unique <br />, mais des cassures double ligne sont entourés par les balises <p>.

La limitation que j'ai trouvé avec elle est qu'il <br />s mais dans un élément de <pre>. Cela va créer de nouvelles lignes doubles, ce qui est pas ce que je veux. Je l'ai fait une modification pour ramasser des éléments pré avec une expression régulière, et un rappel qui dépouillera le <br /> qui fonctionne bien.

Cependant, le principal problème est que j'ai des exemples de code dans mon texte qui obtient auto_p()'d, et je dois préserver l'indentation (pour une meilleure lisibilité). Malheureusement pour moi, les bandes de fonction avant et arrière espace blanc sur les lignes.

Voici le regex que les bandes interlignage

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

Je ne suis pas le meilleur gourou regex, mais je suis assez sûr qui dit « Get grands espaces et les onglets où il y a au moins un et les remplacer par une chaîne vide. »

Je l'ai essayé de supprimer cette ligne, mais il va ajouter <br /> où je ne veux certainement pas - dans un cas, je recevais la sortie comme ceci

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

Comment puis-je modifier cette regex ou un code à bande ne conduisant pas espace à l'intérieur d'un élément <pre>?

La fonction d'aide originale de Kohana est disponible ici . (Faites défiler jusqu'à la presque en bas).

Je sais que je vais obtenir quelques « Utiliser un analyseur HTML » des réponses de type - et pendant que vous pouvez être correct - le code existant utilise simplement regex, et je préfère une solution plus simple (où je n'ai pas d'inclure une bibliothèque, etc.).

Merci pour votre temps.

Était-ce utile?

La solution

Voici comment je le ferais:

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

Après avoir établi une ligne de premier plan des espaces, la préanalyse pour les balises avant numérise de <pre> ou </pre>. La viande de ce bit est préanalyse:

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

Il correspond à zéro ou plus de tout ce qui est pas une équerre gauche, ou une équerre gauche si ce n'est pas le début d'une balise de <pre> ou </pre>. Cette partie ne s'arrêtera correspondant quand il rencontre une balise <pre> (départ), une étiquette de </pre> (fin), ou à la fin de l'entrée. Si c'est une balise de fin qu'il arrête, vous savez que vous êtes à l'intérieur d'un élément de <PRE>, de sorte que vous ne voulez pas faire le remplacement.

Les quantificateurs possessifs ('++', '*+' et '?+') sont essentielles pour prévenir retours en arrière catastrophique . (Je ne peux pas l'aider: cette phrase me fait toujours penser à scénario cascade de résonance Half-Life.)

Cette technique suppose également raisonnablement bien formé HTML, à savoir toutes les balises <pre>...</pre> correctement équilibrée. Mots-clés à l'intérieur des commentaires SGML mess it up, aussi - à moins qu'ils ne soient équilibrés. Vous pouvez traiter des commentaires, aussi, si vous le voulez bien faire le regex deux fois plus long et trois fois plus laid. :)

Autres conseils

Votre problème est discuté beaucoup je suppose - vérifier ce lien

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

Celui-ci ainsi:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top