[RegEx] & naar & maar niet in entities

Pagina: 1
Acties:

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09-2025
Ik probeer voor het printen van XML strings in PHP te voorkomen dat er een & voorkomt in de XML. Het kan echter gebeuren dat er wel een entity voorkomt in dezelfde string. Nu probeer ik dus met een regex de & te replacen met &, zonder de é (bvb) te veranderen in é. Omdat ik niet direct zag hoe ik dat direct kon doen wilde ik eerst proberen om alle é's te veranderen in *^*eacute;'s:

PHP:
1
2
$dsinges = "dinges & dinges oog&oor zaten in een biertje é'";
print preg_replace("/&[a-zA-Z#]{0, 6};/", "*^*\\1", $dsinges);


Ik zou nu willen dat

"dinges & dinges oog&oor zaten in een biertje *^*eacute;*^*#039;"
"dinges & dinges oog&oor zaten in een biertje *^*eacute;*^*#039;"

wordt, zodat ik vervolgens eerst & kan vervangen door & en daarna *^* door &. Snapt men het nog? :)

Rustacean


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Beetje rare regexp :)

Ik zou er sowieso dan /&([a-zA-Z0-9#]{0,6};)/ van maken ;)
Maar er is ook wel een regexp te maken die direct alle &'s op de goede plek replaced, maar ik ben nooit zo goed in die look-ahead en look-back asserties :)

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09-2025
ACM schreef op 12 augustus 2002 @ 22:13:
Ik zou er sowieso dan /&([a-zA-Z0-9#]{0,6};)/ van maken ;)
Maar er is ook wel een regexp te maken die direct alle &'s op de goede plek replaced, maar ik ben nooit zo goed in die look-ahead en look-back asserties :)
Woei! Tnx, dat helpt... :)

Rustacean


Verwijderd

het eerste waar ik aan denk:

print preg_replace("/&([a-zA-Z0-9#]+[^a-zA-Z0-9#;]|\\s)/", "&\\\\1", $dsinges);

een & gevolgd door òf een reeks letters, cijfers of een # die niet wordt gevolgd door een ;, òf een whitespace character, mag vervangen worden door &

[ Voor 0% gewijzigd door Verwijderd op 12-08-2002 22:38 . Reden: html fix ]


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Verwijderd schreef op 12 augustus 2002 @ 22:21:
het eerste waar ik aan denk:
[nohtml]
print preg_replace("/&([a-zA-Z0-9#]+[^a-zA-Z0-9#;]|\\s)/", "&\\\\1", $dsinges);

een & gevolgd door òf een reeks letters, cijfers of een # die niet wordt gevolgd door een ;, òf een whitespace character, mag vervangen worden door &
[/nohtml]

Gaat niet werken :)

Daar moet je echte lookback/ahead asserts voor gebruiken.

Verwijderd

ACM schreef op 12 augustus 2002 @ 22:29:
[nohtml][...][/nohtml]
Gaat niet werken :)

Daar moet je echte lookback/ahead asserts voor gebruiken.

Voorlopig werkt de oplossing die ik gaf op zijn string. :)

Ik heb hem nog even ge-edit, want & was weer & geworden na een edit. Bugje nog in React :)

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09-2025
Hoezo gaat niet werken dan? Bij deze voorbeeldstring werkt het prima, dus ik zie niet waarom het verder niet zou werken.

[edit] Hij heeft wel gelijk...

http://temp.xavamedia.nl/fokzine.xml wordt niet correct getoond met de RegEx van Cheetah, maar wel via die van ACM (mbv onderstaande functie).

PHP:
1
2
3
4
5
function fixEntities($x) {
    $x = preg_replace("/&([a-zA-Z0-9#]{0,6};)/", "*^*\\1", $x);
    $x = str_replace("&", "&", $x);
    return str_replace("*^*", "&", $x);
}

Rustacean


  • J.Hollemans
  • Registratie: September 2001
  • Laatst online: 03-10-2025
Volgens mij is dit een iets "veiligere" regexp met een lookahead:

PHP:
1
preg_replace ( "/&(?!([a-zA-Z]{2,6}|#[0-9]{1,3});)/i", "&", $your_variable );


Hier wordt namelijk ook voor gezorgd dat het &-teken van { wordt geparsed,
maar niet van &3#ag; (wat dus duidelijk geen geldige sequence is)

wel een late post, maar ik vond het wel een nuttige aanvulling die hier op z'n plaats is.


edit:


Hmz, die parser hier is ook niet alles

s/, "&"/, "&"/

;)

[ Voor 18% gewijzigd door J.Hollemans op 21-12-2002 13:07 ]

Far from being some stuffy science, writing regular expressions is closer to an art.


  • J.Hollemans
  • Registratie: September 2001
  • Laatst online: 03-10-2025
hmz ik kan niet meer editen, naja, dan maar een reply:

[a-zA-Z] is nogal nutteloos met de /i modifier dat moet dus gewoon [a-z] zijn ;)

Far from being some stuffy science, writing regular expressions is closer to an art.


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

offtopic:
Als het goed is kun je zo vaak editten als je zelf wilt, zolang er nog geen moderator is geweest die je post heeft aangepast, hoor :)


Manuzhai Ik ben eerlijk gezegd wel benieuwd of je nu niet met symptoombestrijding bezig bent.... Waar gebruik je het voor?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

drm schreef op 21 december 2002 @ 15:03:
Manuzhai Ik ben eerlijk gezegd wel benieuwd of je nu niet met symptoombestrijding bezig bent.... Waar gebruik je het voor?

Ik hoop dat manuzhai er toch wel na 4 maanden mee klaar is...

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

:X ennuh... JeroenHollemans, niet meer zomaar topics kicken he? :D

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz

Pagina: 1