Avatar billede hathor Nybegynder
06. marts 2011 - 20:36 Der er 7 kommentarer og
2 løsninger

At sortere links til sider fra links til til billeder med preg_match_all og ereg_replace - jeg kan ikke finde ud af det :(

Jeg vil gerne integrere en lille funktion på et forum. Funktionen skal finde URLs fra et stykke HTML-baseret tekst udtrykket fra en MySQL database, der linker til et billede på et andet site.


------->
function formatImgssInText($text){
            $img_exUrl = "!http://.+\.(?:jpe?g|png|gif|bmp)!Ui";
            preg_match_all($img_exUrl, $text, $matches);
            $usedPatterns = array();
            foreach($matches[0] as $pattern){
                if(!array_key_exists($pattern, $usedPatterns)){
                    $usedPatterns[$pattern]=true;
                    $text = str_replace($pattern, "<br><br><div class=\"imageContainer\"><img src=\"$pattern\" border=\"0\"></img></div><br><br>", $text);
                }
            }
            return $text;
}
<-------

Det fungerer fint, det ombryder teksten, viser billedet som det skal og fortsætter teksten.

Jeg har i forvejen en funktion, der laver URLs til links:

------->
$text = ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]", "<a href=\"\\0\" target=blank>\\0</a>", $output->Text);
<-------

Problemet opstår når begge funktioner skal anvendes!


Hvis jeg først kører tekst-outputtet gennem ereg_replace, og bagefter gennem preg_match_all, så vises billedet to gange, første gang i sin originale størrelse, så i den størrelse jeg har defineret i min container i mit stylesheet, og noget html outputtes. Det er noget møg.

Hvis jeg kører det den anden vej, altså gennem preg_match_all og derefter gennem ereg_replace, vises billedet ikke, men der linkes på en besynderlig måde internt til sitet det ligger på, og der vises en blank ramme til billedet - teksten ombrydes omkring rammen, som var billedet der. URL'en til billedet der skulle forestille at være der, bliver 'http://xx-mit-site.xx/test/%3Ca%20href=' - og billedet ligger på ekstrabladets hjemmeside, så den URL er altså ikke rigtig. URL'en til billedet outputtes, men ikke som link: http://multimedia.ekstrabladet.dk/static/eb/drfront/images/2011-03/06/37-b53a6eb9-c514351d.jpeg" border="0">



Jeg aner ikke hvad jeg skal gøre, jeg forstår ikke syntaksen til disse funktioner, men er der nogen der kan hjælpe mig mig at få dem til at lade være med at gå i vejen for hinanden?
Avatar billede jakobdo Ekspert
06. marts 2011 - 20:43 #1
Din link replace ting, kunne vel "forfines" så den ikke tager http adresser inden i <tags>
Dermed skulle din nuværende løsning stadig virke.
Avatar billede hathor Nybegynder
06. marts 2011 - 23:27 #2
Men der er jo ingen tags til billederne. Eksempelvis:

http://multimedia.ekstrabladet.dk/archive/00641/photo_3482_20110306_641007c.jpg

Men ja, du har ret, det skal forfines, jeg kan bare ikke finde ud af hvordan.
Avatar billede jakobdo Ekspert
07. marts 2011 - 07:01 #3
Hvis du kører din billede tagger først, så vil billede til f.eks. eb. vel være inden i en <img src="...." /> tag?
Avatar billede hathor Nybegynder
07. marts 2011 - 15:11 #4
Det har du ret i. Det indså jeg 10 minutter efter jeg havde postet at der jo ikke var nogen tags. Typisk at dumme sig og fatte det kort efter.

Jeg har prøvet 

$reg_exUrl = "/[^<img>](http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";

og

$reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?[^<\/img>/";


og med forskellige variationer her over, også med [^<>] i start og slut, og med * og + mellem det, og den alm. link-genkendelse, /(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/


Men jeg kan ikke ramme det rigtige, jeg får mange løjerlige resultater. Jeg kan ganske enkelt ikke gennemskue syntaksen til det regex.

Har læst herinde, http://www.phpartikler.dk/artikler/regexp.php#plus - og det er en enormt god forklaring, men jeg forstår det altså ikke ordentligt endnu. Har også læst på amerikanske sider, og selvf. i manualen, men det kan desværre stå lige for næsen af en, hvis man ikke forstår hvad man læser.

Hvis der er nogen der forstår det, så ville jeg være så enormt taknemlig hvis nogen enten ville skrive mønstret eller fortælle hvad jeg skal fokusere på, og hvilke(n) fejl jeg skal være opmærksom på ikke at gøre - og hvilke fejl jeg har begået indtil videre.
Avatar billede jakobdo Ekspert
07. marts 2011 - 20:14 #5
Tja, jeg har selv forsøgt og kunne sgu ikke lige greje den.
Alternativt kan du prøve at flytte dit spørgsmål over til regulare udtryk kategorien.
Avatar billede hathor Nybegynder
08. marts 2011 - 03:00 #6
Skal vi dele point?
Avatar billede jakobdo Ekspert
08. marts 2011 - 08:30 #7
Kun hvis jeg har bidraget til yderligere viden/hjælp.
Avatar billede hathor Nybegynder
09. marts 2011 - 04:43 #8
Well, du gjorde mig da opmærksom på at der var en kategori for regex - selv om jeg ikke fik noget svar derinde :)



Jeg fandt ud af det, forøvrigt:




            $img_exUrl = "!http://.+\.(?:jpe?g|png|gif|bmp)!Ui";
            preg_match_all($img_exUrl, $text, $matches);
            $usedPatterns = array();
            foreach($matches[0] as $pattern){
                if(!array_key_exists($pattern, $usedPatterns)){
                    $usedPatterns[$pattern]=true;
                    $text = str_replace($pattern, "<br><br><a href=\"$pattern\"><img src=\"$pattern\" border=no class=\"reduced50\"/></span></a><br><br>", $text);
                }
            }
            return $text;
}

function formatUrlsInText($text){
            $reg_exUrl = "/(\s|\n|^)(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
            preg_match_all($reg_exUrl, $text, $matches);
            $usedPatterns = array();
            foreach($matches[0] as $pattern){
                if(!array_key_exists($pattern, $usedPatterns)){
                    $usedPatterns[$pattern]=true;
                    $text = str_replace ($pattern, "<a href=\"$pattern\">$pattern</a>", $text);
               
                }
            }
            return $text;
}


Strengen føres først gennem den ene og så bagefter gennem den anden funktion - første gennemløb sæt <img> tags på URLs der ender på billeder, andet gennemløb sætter <a href> på URLs der linker til sider, og udelader URLs indkapslede i tags.
Avatar billede jakobdo Ekspert
09. marts 2011 - 05:50 #9
Smart. Ja det kan sgu nogle gange være svært at tænke alle løsniger, men godt der var en. Og takker for point.
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