Avatar billede arkanoid Nybegynder
10. juni 2006 - 11:21 Der er 8 kommentarer og
1 løsning

preg_replace og xhtml-validering

For at xhtml skal validere, skal alle instanser af & konverteres til &. Men da jeg hiver indholdet ud af en database er nogle dele allerede html-formateret, det vil f.eks. sige at æ er æ og deslige. Summa summarum er at jeg kun vil erstatte ampersands i a-tagget href-attribut.
Derfor her jeg forsøgt mig med følgende kode:

$input = preg_replace("{\[url\](.*?)\[/url\]}", "<a href='\\1'>\\1</a>",$input);
$input = preg_replace("{\[url=(.*?)\](.*?)\[/url\]}", "<a href='\\1' title='\\1'>\\2</a>",$input);
$input = preg_replace("{(<a href='.*)&(.*>)}", "\\1&amp;\\2", $input);

Problemet er bare at den ikke virker efter hensigten, & bliver ikke konverteret.

Formålet med den sidste linje er altså at "&"-tegn i href-attributten bliver konverteret til &amp;, men også kun dem.
Avatar billede razor Nybegynder
10. juni 2006 - 16:42 #1
<?php
$tekst = 'heste &amp; ponyer: <a href="http://heste.dk/?foo=bar&baz=quuz">foobar</a>'."\n";
print preg_replace('/&(?!amp;)/', '&amp;', $tekst);
?>

Kan du ikke bare erstatte alle forkomster af & der ikke efterfoelges af 'amp;'?
Avatar billede gizmo-gizmo Nybegynder
10. juni 2006 - 16:44 #2
Jeg kunne ikke helt få det til at virke som jeg havde planlagt (er ingen ørn til reg.exp. :-): men her er en lidt alternativ måde, der dog burde virke ok:

function replace($regs)
{
  return $regs[1] . preg_replace("/&/", "&amp;", $regs[2]) . $regs[3];
}

$str = "Bjørn && okay: <a href=\"?this=that&that=this&something=1\" title=\"somesing\">Greaaat</a>";

$str = preg_replace_callback("/(<a[^<>]*href=[\"|\'])([^\"\']*)([\"|\'][^<>]*>)/i", "replace", $str);

echo $str;
Avatar billede gizmo-gizmo Nybegynder
10. juni 2006 - 16:45 #3
Great, razor ;)  Men hvad så hvis der er & i teksten og andre steder som gerne må være der? altså ikke kun i url'en
Avatar billede coderdk Praktikant
10. juni 2006 - 16:45 #4
Prøv:

$input = preg_replace("{<a href=[\"'](.*?)[\"']>}e", 'preg_replace("{&(?!amp;)}","&amp;","\\1")', $input);
Avatar billede coderdk Praktikant
10. juni 2006 - 16:46 #5
Hmm skal alle & ikke være &amp; egentlig?
Avatar billede razor Nybegynder
10. juni 2006 - 16:46 #6
gizmo-gizmo, de skal vel erstattes alligevel?
Avatar billede razor Nybegynder
10. juni 2006 - 16:46 #7
My point exactly :)
Avatar billede coderdk Praktikant
10. juni 2006 - 16:47 #8
Jeg tror bare du skal bruge razor's løsning
Avatar billede gizmo-gizmo Nybegynder
10. juni 2006 - 16:47 #9
Ahh, okay, så bliver det selvfølgelig lidt lettere :-) 
Glem min slamløsning ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester