[PHP] Server HTML output ontdoen van break

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

Onderwerpen


Acties:
  • 0 Henk 'm!

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?

Acties:
  • 0 Henk 'm!

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.

Acties:
  • 0 Henk 'm!

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

Acties:
  • 0 Henk 'm!

  • 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.


Acties:
  • 0 Henk 'm!

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...

Acties:
  • 0 Henk 'm!

  • 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


Acties:
  • 0 Henk 'm!

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...

Acties:
  • 0 Henk 'm!

  • 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


Acties:
  • 0 Henk 'm!

  • 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