[php] preg replace guru gezocht, ik word nl. gek.

Pagina: 1
Acties:

  • red_indian
  • Registratie: Maart 2000
  • Laatst online: 24-06 16:43

red_indian

 Smokin' Suckz B!

Topicstarter
na 5-6 uur (geen geintje :(), alle mogelijk preg_replace / match_all patterns te hebben geprobeerd, is het me eindelijk gelukt om mijn doel te bereiken. alleen moet het volgens mij korter kunnen dan dit. :P

het probleem is dat er maar 1 of maximaal 2 match(es) vervangen worden. om dit op te lossen heb ik er een loop aan toegevoegd, en het werkt.

maar welke preg_replace guru legt mij even uit hoe ik dit de volgende keer zonder loop kan oplossen? volgens de php documentatie moet de functie ook alle instanties vervangen, tenzij je dit limiteert.

de bedoeling:
als je mail binnen haalt via een socket, dan worden een aantal karakters geencodeerd. nu wil ik dit decoderen.

de code moet elke '=' met een hexadecimaal getal erachter (bijv. '=E1', of '=08') vervangen door '&#' met dan de decimale waarde (bijv. '&#233', of '&#08'). dit mag alleen *buiten* html tags gebeuren. klinkt simpel he? niet voor mij |:(

de code:
PHP:
1
<?$html = "<HENK =E1>=E1enzo</HENK><FONT face=Verdana size=4>sw=E9=E9=E9=E9t! alabam=E1! :) =E1</FONT>";$match    = ">([^<]*?)((=([0-9, A-F]{2}))+?)([^>]*?)<\/";preg_match_all ( "/$match/", $html, $matches);while ( count ( $matches[0] ) > 0 ){    preg_match_all ( "/$match/", $html, $matches);    $html    = preg_replace ("/$match/e", "\">\\1&amp;amp;amp;#\".hexdec(\"\\4\").\"\\5</\"", $html);}echo $html;?>

bovenstaande geeft als resultaat:
PHP:
1
<?<HENK =E1>áenzo</HENK><FONT face=Verdana size=4>swéééét! alabamá! :) á</FONT>?>

(excuses voor het voorbeeld :+)

alvast bedankt voor de tips, oplossingen...

edit:

rare zin, één van de, hehe, en toen ging bij de edit de layout er aan

Need a cuesheet/tracklisting? (meer dan 500.000 online)


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Na wat geklooi lukt 't ook mij niet om 't met een enkele regexp te doen, maar ik ben geen fully-qualified regexp guru. Ik kan wel een aardig stuk korter alternatief geven:
code:
1
2
3
while($html != 
  ($tmp=preg_replace("/(>[^<]*?)=([0-9A-F]{2})/e",'"\\1&#".hexdec("\\2")."\\3"',$html)) )
    $html=$tmp;

  • tomato
  • Registratie: November 1999
  • Niet online
Hmm, dit lijkt me toch redelijk te werken:
code:
1
2
3
4
5
6
7
8
s/
    (<[^>]+>)
    |
    =([0-9A-F]{2})
/
    defined $1 ?
        $1 : '&#'.hex $2
/xeg;

Zit niets geks in, moet dus ook zo in PHP te schrijven zijn. Overigens wordt er nog geen rekening gehouden met een eventuele < of > binnen een gequote waarde van een HTML attribute. Dit zal ook niet zo vaak voorkomen neem ik aan (maar als je er echt een oplossing voor wilt moet je even roepen ;)).

Enjoy :)

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Waarom kan ik zoiets nou niet bedenken! |:(

edit:
Laat maar, ik probeerde slim te doen.

Verwijderd

ik weet niet of dit hier van toepassing is, maar is dat niet gewoon quoted_printable gecodeerde mail? :)

  • red_indian
  • Registratie: Maart 2000
  • Laatst online: 24-06 16:43

red_indian

 Smokin' Suckz B!

Topicstarter
Op vrijdag 12 april 2002 08:54 schreef DarthRaider het volgende:
ik weet niet of dit hier van toepassing is, maar is dat niet gewoon quoted_printable gecodeerde mail? :)
kun je dat niet eerder zeggen? :D

daar heb ik nu 5-6 uur noeste arbeid voor verzet. |:(
ik heb wel gezocht (als eerste natuurlijk) naar een decodeer functie, maar niet goed genoeg naar nu blijkt. :(

dat is idd een stuk makkelijker, en vooral korter :+

hoe dan ook, het blijft een uitdagende regex? :9

Need a cuesheet/tracklisting? (meer dan 500.000 online)

Pagina: 1