Toon posts:

[PHP] Server HTML output ontdoen van break

Pagina: 1
Acties:
  • 123 views sinds 30-01-2008
  • Reageer

Onderwerpen


Verwijderd

Topicstarter
Ik wil de output van mijn CMS'je graag versturen zonder breaks. Met andere woorden:
HTML:
1
2
3
4
5
6
7
<div id="mijn_div">
  <h1>Een kop</h1>
  <p>Hier de content</p>
</div>

/* wordt verstuurd als: */
<div id="mijn_div"><h1>Een kop</h1><p>Hier de content</p></div>

Ik heb hier (na een hoop gepruts) de volgende regex voor gevonden:
PHP:
1
$output = preg_replace("'([\r\n])[\s]+'", "", $output);

Dit werkt goed, behalve als er een textarea met content in de output zit:
HTML:
1
2
3
4
5
6
7
8
9
10
11
<div id="mijn_div">
  <textarea>
    * {
        margin: 0;
        padding: 0;
    }
  </textarea>
</div>

/* wordt nu verstuurd als: */
<div id="mijn_div"><textarea>* {margin: 0; padding: 0;}</textarea></div>

En dat moet dus niet. Als ik bv. een stylesheet open vanaf de server, ziet dat er niet uit in de textarea waarin je het kunt bewerken:
Cascading Stylesheet:
1
2
{margin: 0;padding: 0;}body {background: #fff url(bg.gif) repeat-x fixed;font: 75%/1.4 Arial, sans-serif;line-height: 18px;overflow: -moz-scrollbars-vertical;height: 100%;padding-top: 10px;}table, th, td {border-color: #9C9A9C; border-collapse: collapse;}img {border: 0;}img.icon {margin: 0 15px 16px 0; padding: 0 0 20px 0; vertical-align: top; float:
/* etc. dus... */

Mijn vraag is dus hoe ik de regex moet aanpassen, zodat deze content tussen <textarea>-tags ongemoeid laat. Welke regex koning kan mij helpen?

Verwijderd

't Zal waarschijnlijk wel (ongeveer) kunnen met een stoere regex, maar dit is een schoolvoorbeeld waar een state machine, een betere oplossing is.
1- Zoek naar '<textarea>'
2- Verwijder alle CRLF's / leading spaces uit de tekst tot aan '<textarea>' (kan prima met jouw regex)
3- Zoek naar '</textarea>', en laat de tekst vanaf de eerder gevonden '<textarea>' intact
4- Herhaal dit tot aan het einde van de tekst.

Elke keer dat je '<textarea>' of '</textarea>' tegenkomt verander je een state variabele om aan te geven of je wel of niet moet strippen.

  • Hielko
  • Registratie: Januari 2000
  • Laatst online: 17:18
Een reguliere expressie is afaik een (eindige) state machine....

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Je kan heel stiekem kijken hoe anderen 't doen op 't web: http://www.design215.com/toolbox/whitespace.php

edit:

Oh sheize, ik zie het al: je wilt in de textarea de code intact laten :) Dan lijkt het me verstandiger om te gaan tokenizen :)

[ Voor 40% gewijzigd door BtM909 op 04-01-2008 22:43 ]

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Verwijderd

BtM909 schreef op vrijdag 04 januari 2008 @ 22:41:
Oh sheize, ik zie het al: je wilt in de textarea de code intact laten :) Dan lijkt het me verstandiger om te gaan tokenizen :)
Tokenizen of een stack based parser is hier wat overkill, omdat je textareas toch niet kunt/wilt nesten...

  • mocean
  • Registratie: November 2000
  • Laatst online: 04-09 10:34
Als je het genieriek wil maken, wil je ook op andere plekken de newlines behouden, denk bijv. aan
<script> tags (je javascript kan errors gaan geven als je klakkeloos newlines stripped) of binnen <pre> tags

Koop of verkoop je webshop: ecquisition.com


Verwijderd

Die javascript errors kun je voorkomen door newlines niet te strippen maar te vervangen door 1 spatie. <pre> zul je wel net als <textarea> af moeten vangen, maar aangezien beide dezelfde afhandeling hebben (niks strippen) kun je nog steeds uit met een 2-state state machine.
Maar voor een regular expression wordt 't dan wel een heel stuk lastiger...

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

over het algemeen is HTTP-compressie effectiever dan dit soort geneuzel in de marge ;)

Intentionally left blank


  • kunnen
  • Registratie: Februari 2004
  • Niet online
Vervang eerst je textboxen door een unieke key, strip dan newlines, en plaats dan de textboxen terug?
Pagina: 1