[php] regels in string uitlezen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 23:02
Ik maak voor een cms gebruik van htmlarea (http://www.dynarch.com/htmlarea) Ik heb echter een probleem, de html die dit script uitpoept is niet zo mooi.

Met niet zo mooi wil ik zeggen dat hij alles op 1 regel achter elkaar zet, en ik ben iemand die vrij veel geeft om netjes uitgelijnde html zodat, als ik een keer neit met de wysiwyg html editer werk ik ook nette html krijg.

Aangezien het probleem van alles op 1 regel zetten in internet explorer zit (in Mozilla blijft de html wel gewoon mooi uitgelijnd) ben ik niet naar het javascript gaan kijken, maar begonnen met een php script.

Wat ik wil is het volgende
1; dat na bepaalde html tage (tr, td, table, div, font, p) en voor/na het openen van de php mode (<?) en natuurlijk na de php ; een nieuwe regel wordt geopend, dit is op zich gelukt
2; het overzichtelijk maken van tabellen
code:
1
2
3
4
5
6
7
<table>
  <tr>
    <td>
    tekst
    </td>
  </tr>
</table>

Dit is me tot nu toe nog niet gelukt :(. Ik heb wel bedacht hoe het ongeveer kan, maar krijg dat niet omgezet naar php.

Vanaf een regel waar een <tr> of een <td> tegen wordt gekomen moeten 2 spaties worden toegevoegd, en vanaf elke regel waar een </td> of </tr> tegen wordt gekomen moeten er 2 spaties worden verwijderd.

De code die ik tot nu toe heb is (ongeveer, paar voor mij specifieke dingen verwijderd):
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?
$tekst = stripslashes($tekst);
$tekst = ereg_replace("<\?", "\n<?\n", $tekst);
$tekst = ereg_replace("\?>", "\n?>\n", $tekst);
$tekst = ereg_replace('<br>', "<br>\n", $tekst);
$tekst = preg_replace("#\<td(.*?)\>#si", "\n<td\\1>", $tekst);
$tekst = preg_replace("#\<tr(.*?)\>#si", "\n<tr\\1>", $tekst);
$tekst = preg_replace("#\<table(.*?)\>#si", "\n<table\\1>", $tekst);
$tekst = preg_replace("#\<tbody(.*?)\>#si", "\n<tbody\\1>", $tekst);
$tekst = preg_replace("#\</td(.*?)\>#si", "\n</td\\1>", $tekst);
$tekst = preg_replace("#\</tr(.*?)\>#si", "\n</tr\\1>", $tekst);
$tekst = preg_replace("#\</table(.*?)\>#si", "\n</table\\1>", $tekst);
$tekst = preg_replace("#\</tbody(.*?)\>#si", "\n</tbody\\1>", $tekst);
$tekst = preg_replace("#\<div(.*?)\>#si", "\n<div\\1>", $tekst);
$tekst = preg_replace("#\</div(.*?)\>#si", "\n</div\\1>", $tekst);
$tekst = preg_replace("#\<p(.*?)\>#si", "\n<p\\1>", $tekst);
$tekst = preg_replace("#\</p(.*?)\>#si", "\n</p\\1>", $tekst);
$tekst = preg_replace("#\<font(.*?)\>#si", "\n<font\\1>\n", $tekst);
$tekst = preg_replace("#\</font(.*?)\>#si", "\n</font\\1>", $tekst);
?>


Op zich zal het me wel lukken om 2 spaties (of evt een tab) toe te voegen voor <tr> en </td> tags, maar om dat bij alle komende regels te doen gaat mij niet lukken...
Een mogelijk opzet zou misschien kunnen zijn om eerst alle regels in een array te zetten en vergens te kijken of de array een <td> of <tr> bevat en dan alle elementen van de array met een hogere index 2 spaties toevoegen, of bij </td> en </tr> de eerste 2 characters (die dan dus spaties zijn) laten verwijderen. Hier bleef ik echter steken aangezien het mij niet gelukt is om elke regel (gescheiden met \n) van een string in een array te zetten. (Dit verklaart ook mijn topictitel)

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


Acties:
  • 0 Henk 'm!

Verwijderd

Hmm, ik zou zeggen, kijk is op php.net naar de functie explode :)

Voorbeeldje (als ik je goed begrepen heb) :
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$arr = explode("\n", $str);

foreach ($arr as $k => $v)
{
 if (ereg('<table', $v))
    {
      echo $v . "\n";
    }
 if (ereg('<tr', $v) || ereg('</tr', $v))
    {
      echo ' '. $v . "\n";
    }
 if (ereg('<td', $v))
    {
      echo '  '. $v . "\n";
    }
}
?>


Dit stukje code geeft dus 1 spatie vóór elke <tr>, 2 vóór elke <td> etc.

[ Voor 40% gewijzigd door Verwijderd op 07-01-2004 12:17 ]


Acties:
  • 0 Henk 'm!

  • Banpei
  • Registratie: Juli 2001
  • Laatst online: 25-10-2022

Banpei

Hachiroku on this touge?

pietje63 schreef op 07 januari 2004 @ 11:34:
Dit is me tot nu toe nog niet gelukt :(. Ik heb wel bedacht hoe het ongeveer kan, maar krijg dat niet omgezet naar php.

Vanaf een regel waar een <tr> of een <td> tegen wordt gekomen moeten 2 spaties worden toegevoegd, en vanaf elke regel waar een </td> of </tr> tegen wordt gekomen moeten er 2 spaties worden verwijderd.

Op zich zal het me wel lukken om 2 spaties (of evt een tab) toe te voegen voor <tr> en </td> tags, maar om dat bij alle komende regels te doen gaat mij niet lukken...
Een mogelijk opzet zou misschien kunnen zijn om eerst alle regels in een array te zetten en vergens te kijken of de array een <td> of <tr> bevat en dan alle elementen van de array met een hogere index 2 spaties toevoegen, of bij </td> en </tr> de eerste 2 characters (die dan dus spaties zijn) laten verwijderen. Hier bleef ik echter steken aangezien het mij niet gelukt is om elke regel (gescheiden met \n) van een string in een array te zetten. (Dit verklaart ook mijn topictitel)
Waar je dan op uitkomt is dat je dan een eigen html parser gaat schrijven. Ik heb dat zelf moeten doen (reden: ook een html editor die soortgelijke problemen veroorzaakt waarbij ik de html weer naar pdflib moest formateren) en ben zelf toen aan de slag gegaan met preg_split om de htmltags te scheiden van de tekst.

code:
1
2
3
$pattern = "/<([^<]*)>/";
$splitted_text = preg_split($pattern, $source_html);
preg_match_all($pattern, $source_html, $matched_tags);

Hierna heb ik dus in $splitted_text alle tekst en in $matched_tags alle tags staan als arrays staan. Deze arrays lopen gelijk op omdat ze gesplitst en gematched zijn op hetzelfde pattern. Daarna kan je er eigenlijk mee doen wat je wilt. ;)

AE86 gevonden! | So what I thought I'd do was, I'd pretend to be one of those deaf-mutes.


Acties:
  • 0 Henk 'm!

  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 23:02
Verwijderd schreef op 07 januari 2004 @ 12:15:
Hmm, ik zou zeggen, kijk is op php.net naar de functie explode :)

Voorbeeldje (als ik je goed begrepen heb) :
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$arr = explode("\n", $str);

foreach ($arr as $k => $v)
{
 if (ereg('<table', $v))
    {
      echo $v . "\n";
    }
 if (ereg('<tr', $v) || ereg('</tr', $v))
    {
      echo ' '. $v . "\n";
    }
 if (ereg('<td', $v))
    {
      echo '  '. $v . "\n";
    }
}
?>


Dit stukje code geeft dus 1 spatie vóór elke <tr>, 2 vóór elke <td> etc.
Dit is een mooie begin, maar dit had ook nog gekunnen met preg_replace. Ik ga proberen met dit als begin een loop in te bouwen die bij het tegenkomen van een <tr of <td naar het arraynummer kijkt en vervolgens bij alle elementen met een hoger arraynummer de spaties toevoegd. Op deze manier kun je (hoop ik) zorgen dat de data uit een cel ook evenver inspringt als de <td> en dat tabellen in tabellen ook goed worden weergegeven.

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


Acties:
  • 0 Henk 'm!

  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 23:02
het is me gelukt :)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$arr = explode("\n", $tekst);
foreach ($arr as $k => $v)
{
if (ereg('<tr', $v) || ereg('<td', $v))
    {
      $space = "  " . $space;  // dit zijn de spaties om te zorgen dat <tr> en <td> opschuiven
    }
if (ereg('</td', $v))
    {
      $space = substr($space,0,-2); // verwijderen van de spaties om van data naar </td> te gaan
    }

$output .= $space . $v . "\n"; // hier wordt de tekst verzameld

if (ereg('<td', $v))
    {
      $space = "  " . $space;  // extra spaties zodat de tekst na td opschuift
    }
if (ereg('</td', $v) || ereg('</tr', $v))
    {
      $space = substr($space,0,-2); // Na /td of /tr een stapje terug :)
    }
} // einde foreach

echo $output;

Ik was eerst veel te moeilijk bezig met foreach in om elke array elke keer te wijzigen maar dit werkt perfect en is simpeler dus sneller.

[ Voor 46% gewijzigd door pietje63 op 07-01-2004 14:08 ]

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


Acties:
  • 0 Henk 'm!

Verwijderd

Als je nu overal ereg() door preg_match() vervangt is het nog sneller :p
Note: preg_match(), which uses a Perl-compatible regular expression syntax, is often a faster alternative to ereg().
Pagina: 1