[js] Regular Expressions, teken invoegen achter expr.

Pagina: 1
Acties:

  • r0bert
  • Registratie: September 2001
  • Laatst online: 11-08 16:19
* r0bert is niet echt bekend met RE, maar heb wel het een en ander doorgenomen en gezocht, maar kom 'r niet echt uit

Ik wil graag na iedere HTML tag een newline invoegen. Ik wou dat even dmv regular expressions fixen, maar dat valt behoorlijk tegen. De RE heb ik nu aardig in elkaar zitten, alleen nu wil ik niet dat de expression/string vervangen woord, maar dat erachter een newline wordt toegevoegd (\n).

Wat ik nu heb:
JavaScript:
1
2
3
4
5
regExpr = new RegExp("[<|</][a-Z]+[>|/>]");

strString = '<p>Hier staat een tekst</p>';

strResult = strString.replace(regExpr, '\n');

Het resultaat zou zoiets moeten zijn
code:
1
2
3
<p>\n                                              newline
  Hier staat een tekst
</p>\n                                             newline

Het liefst zou ik die \n er (óók nog) voor hebben dus \n<p>\n maar misschien wordt dat weer te moeilijk.. Kan iemand me ff helpeuh ? :)

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

zoiets?
JavaScript:
1
2
3
4
5
regExpr = new RegExp("((<\/?)([a-z]+)(\/?>))", "gi");

strString = '<p>Hier staat een tekst</p>';

strResult = strString.replace(regExpr, '\n$1\n');

[ Voor 22% gewijzigd door Annie op 27-02-2003 23:00 ]

Today's subliminal thought is:


  • r0bert
  • Registratie: September 2001
  • Laatst online: 11-08 16:19
Joah!! Daar heb ik dan al die uren op zit klooien :| :P Ik heb alleen nog even toegevoegd dat je ook een spatie voor de /> kunt gebruiken! Verder issie helemaal top!

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

r0bert schreef op 27 February 2003 @ 23:05:
Joah!! Daar heb ik dan al die uren op zit klooien :| :P Ik heb alleen nog even toegevoegd dat je ook een spatie voor de /> kunt gebruiken! Verder issie helemaal top!
Wellicht overbodig, maar heb je de RegEx Tutorial van drm ook al gelezen :? Daar staan namelijk wel een paar goede punten (uitleg, etc) in.

Klikkerdeklik

  • r0bert
  • Registratie: September 2001
  • Laatst online: 11-08 16:19
Ik wil nu graag dat iedere tag een newline voor en achter krijgt, dus niet alleen <tekst> tags, maar ook <tekst waarde="bl#$t" />
Het leek mij het meest logisch om dan [a-z] te vervangen door . (een punt dus) maar dat lijkt niet te werken, iemand enug idee waarom dat niet werkt en/of hoe het dan wel moet.

* r0bert print drms tut even uit
edit:
hmm niet zo'n uitgebreide tutorial zie ik :?

[ Voor 12% gewijzigd door r0bert op 27-02-2003 23:56 ]


  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

If then else matters! - I5 12600KF, Asus Tuf GT501, Gigabyte Gaming OC 16G 5080 RTX, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 10:36

crisp

Devver

Pixelated

Ik heb veel gehad aan de reference pages van php wb de PCRE syntax (wat volgens mij bijna hetzelfde is):
http://www.php.net/manual/en/ref.pcre.php
r0bert schreef op 27 February 2003 @ 23:51:
Ik wil nu graag dat iedere tag een newline voor en achter krijgt, dus niet alleen <tekst> tags, maar ook <tekst waarde="bl#$t" />
Het leek mij het meest logisch om dan [a-z] te vervangen door . (een punt dus) maar dat lijkt niet te werken, iemand enug idee waarom dat niet werkt en/of hoe het dan wel moet.

* r0bert print drms tut even uit
edit:
hmm niet zo'n uitgebreide tutorial zie ik :?
Ik denk dat je de 'g' modifier dan weg moet laten om 'm ungreedy te maken :)

[ Voor 67% gewijzigd door crisp op 28-02-2003 08:56 ]

Intentionally left blank


Verwijderd

g is voor global search toch (dus allemala vervangen en niet alleen de eerste occurence)
voor nongreedy moest je gewoon .? doen (correct me if i'm wrong, dit graaf ik ver uit m'n geheugen)

  • r0bert
  • Registratie: September 2001
  • Laatst online: 11-08 16:19
Inderdaad, google is toppie. Maar denk je echt dat ik nog niet via google gezocht heb :?

Kan iemand mij precieser uitleggen waarom mijn manier niet werkt :S :?

[ Voor 14% gewijzigd door r0bert op 28-02-2003 12:00 ]


  • 2
  • Registratie: November 2000
  • Laatst online: 31-03 13:52

2

Je vervangt nu hetgeen dat matcht met "\n". Dat wil je natuurlijk niet, want dan verander je al je tags in newlines. Wat je wil is hetgeen dat matcht vervangen met hetgeen dat match + een newline. Met $1 verwijs je naar je eerste match (tussen haakjes). Als je dus zoiets hebt:

code:
1
(^foo)bar(baz$)


dan zou $1 verwijzen naar het gedeelte van je string dat match met 'foo', en $2 naar het gedeelte dat matcht met 'baz'.

Verwijderd

omdat die . greedy is (> telt dus ook mee en daar gaat ie gewoon overheen tot ie de laatste > tegen komt), je moet 'm dus non greedy maken, dat moest volgens mij met een ? of de > excluden, dus ipv . (alles) [^>] (alles behalve >)

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 10:36

crisp

Devver

Pixelated

Ik heb nu het volgende bedacht (niet schrikken ;) ):
JavaScript:
1
2
3
regExpr = new RegExp('(<[^>]+>(<\/([^>\/]+)>)?|<\/([^>\/]+)>|[^<>]+)(\r\n|\n|\r)?', 'gi');
strString = '<p>Hier staat een tekst</p>';
strResult = strString.replace(regExpr, '$1\n');


Uitleg:

match 1) <[^>]+>(<\/([^>\/]+)>)?

oftewel een string die begint met < en eindigt met > en waartussen geen > voorkomt (bv <span class="blaat"> matched). Neem een eventuele afsluittag die er direct achter staat ook mee (bv <textarea></textarea>)

of match 2) <\/([^>\/]+)>

oftewel een string die begint met </ en eindigt met > en waartussen geen > of / voorkomt (los afsluit element, bv </span>)

of match 3) [^<>]+

oftewel een string die geen < of > bevat (alle text tussen elementen dus)

match 4) (\r\n|\n|\r)?

Als de match eventueel al gevolgd wordt door een newline, neem dan de newline mee in de match.

Vervolgens zetten we achter elke match een newline :)

Edit: doet ut nog niet goed met bv <a href="blaat/pompiedoe"> - nog ff uitbreiden... :(

Edit2: fixed :)

Edit3: Edit2 was onwerkbaar traag :)

Zelfs van de GoT source weet 'ie nog iets te maken: testpagina :)

[ Voor 88% gewijzigd door crisp op 01-03-2003 01:11 ]

Intentionally left blank


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 10:36

crisp

Devver

Pixelated

*schop*

Nu heb ik een uur zitten klooien op die regexp, krijg ik geen reacties meer :'( ;)

Intentionally left blank


  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Vind je het gek?
Ik heb deze pagina vanaf toen tot en met nu voor me gehad, en zit me nog te verbazen ;)
Nee errug cool gedaan.

If then else matters! - I5 12600KF, Asus Tuf GT501, Gigabyte Gaming OC 16G 5080 RTX, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


  • r0bert
  • Registratie: September 2001
  • Laatst online: 11-08 16:19
Ohw oeps, spijt me! Ik was zo enthousiast met je regexpr dat ik er meteen mee aan de slag ben gegaan! Hij werkt prima :P Intussentijd ben ik aan het vogelen gegaan hoe het nou allemaal in elkaar steekt, want volgende keer wil ik het natuurlijk zelluf kunnen :) (duh!) :PB)

Maar hé, heel erg bedankt hoor.. als ik je ergens mee kan helpen laat het maar ff horen :)

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 10:36

crisp

Devver

Pixelated

r0bert schreef op 03 March 2003 @ 20:59:
Ohw oeps, spijt me! Ik was zo enthousiast met je regexpr dat ik er meteen mee aan de slag ben gegaan! Hij werkt prima :P Intussentijd ben ik aan het vogelen gegaan hoe het nou allemaal in elkaar steekt, want volgende keer wil ik het natuurlijk zelluf kunnen :) (duh!) :PB)
Oefenen... veeeel oefenen.... ;)
Maar hé, heel erg bedankt hoor.. als ik je ergens mee kan helpen laat het maar ff horen :)
graag gedaan hoor :)

Intentionally left blank


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 10:36

crisp

Devver

Pixelated

Match 1 en 2 omdraaien geeft betere resultaten:

JavaScript:
1
regExpr = new RegExp('(<\/([^>\/]+)>|<[^>]+>(<\/([^>\/]+)>)?|[^<>]+)(\r\n|\n|\r)?', 'gi');


Het ging namelijk fout bij bijvoorbeeld:
HTML:
1
<table><tr><td>hoi</td></tr></table>

dat werd:
HTML:
1
2
3
4
5
6
<table>
<tr>
<td>
hoi
</td></tr>
</table>

:)

Intentionally left blank

Pagina: 1