Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Feb 2005

preg_replace i php med regexp

Jag försöker leta upp länkar i en text hämtad ur en xml med hjälp av preg_replace i php.
Det jag vill kunna göra är att behandla en vanlig länk och lägga till "<a href='" före denna och "'>http://länkadressen..</a>" efter. Samtidigt så ska den känna av om länken slutar med .jpg, .gif eller .png varpå den behandlar denna länk annorlunda och lägger istället till "<img src='" före och "' />" efter.

Som exempel så ser själva innehållet ut så här:

$Content = "Massa text ... http://www.enlänk.se/ ..... mer text .... http://adress.se/bild.jpg .... mer text.";

Vad jag förstått så är preg_replace med regular expressions bästa sättet att attackera problemet på. Problemet är att jag har svårigheter att förstå strukturen på det hela, speciellt för att få in text innan och efter en länk samtidigt som detta ska kunna behandlas på olika vis beroende på vad det är för länk.

All hjälp uppskattas!

i7 920 | 12GB DDR3 | GTX 480 | GA-X58A-UD7 | 160GB SSD X25-M G2 | 1TB F3 HD103SJ | W7 64-bit | Mac Mini
Webb: bluekitestudios.com

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007

$pattern = '/http:\/\/[\w\.\/~#?=&%]+/'; // matchar exempelvis http://www.google.com/~flygandeorm/glass.jpg $match = array(); while (true) { // din slinga här // hämta en rad från din textfil, exempelvis.. // $en_rad_text = 'blah blah utfyllnadstext http://www.sweclockers.com/forum/showthread.php?s=&threadid=8...| oj där kom ett konstigt tecken som inte får finnas i en URL'; preg_match($pattern, $en_rad_text, $match); // nu ligger alla matchningar för raden i arrayen $match } // gör något med $match

edit: Jag missförstod dig tyvärr.. får tänka om lite.

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Feb 2005

Tack för försöket, riktigt grymt om du lyckas!

i7 920 | 12GB DDR3 | GTX 480 | GA-X58A-UD7 | 160GB SSD X25-M G2 | 1TB F3 HD103SJ | W7 64-bit | Mac Mini
Webb: bluekitestudios.com

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007

Prova detta (otestad kod):

function my_callback($match) { $str = $match[0]; switch (strtolower(substr($str, -4))) { case '.gif': case '.jpg': case '.png': return '<img src="' . $str . '" />'; break; } return '<a href="' . $str . '">' . $str . '</a>'; } $pattern = '/(ftp|http|https):\/\/(\w+:\w+@)?[\w.]+(:\d+)?[\w\Q.\/?()+~#=&%\E]+/'; preg_replace_callback($pattern, 'my_callback', $en_rad_text);

edit: uppdaterade pattern

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Feb 2005

Tack Teknocide! Skall testas imorn, gillade för övrigt att du gjort uppbyggnaden lättläst!
Om du orkar så vore det kul med en liten genomgång vad som händer i $pattern, det är just regexp som jag har svårt att överblicka.

i7 920 | 12GB DDR3 | GTX 480 | GA-X58A-UD7 | 160GB SSD X25-M G2 | 1TB F3 HD103SJ | W7 64-bit | Mac Mini
Webb: bluekitestudios.com

Trädvy Permalänk
Medlem
Plats
Bromma
Registrerad
Aug 2008

borde du inte skriva
$pattern = '/https?:\/\/[\w\Q./?~#=&%()\E]+/';

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Feb 2005

Hittade denna sida för den som vill läsa på lite om regular expressions (så slipper ni förklara)
http://weblogtoolscollection.com/regex/regex.php

KurreKula har jag rätt om jag säger att din modifiering kollar om det antingen är http eller https? Känns som jag är detta lite på spåren.

i7 920 | 12GB DDR3 | GTX 480 | GA-X58A-UD7 | 160GB SSD X25-M G2 | 1TB F3 HD103SJ | W7 64-bit | Mac Mini
Webb: bluekitestudios.com

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007
Citat:

Ursprungligen inskrivet av KurreKula
borde du inte skriva
$pattern = '/https?:\/\/[\w\Q./?~#=&%()\E]+/';

Bra korrigering

save: Frågetecknet gör tecknet innan valfritt. Dvs, pattern matchar både http:// och https://. Egentligen kan man kanske ändra det till :\/\/ för att få med alla protokoll på en gång, fast då ökar risken att man även plockar upp slask.

(ftp|http|https):\/\/ är ett annat alternativ som även fångar ftp.

Denna sida tycker jag är bra! http://www.regular-expressions.info/

uppdatering: Nytt pattern (stödjer ftp/lösenord/port etc. kanske lite overkill men vafan!):

$pattern = '/(ftp|http|https):\/\/(\w+:\w+@)?[\w.]+(:\d+)?[\w\Q.\/?()+~#=&%\E]+/';

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Feb 2005

Tack åter igen Teknocide, säg till om du vill ha något grafiskt gjort någon gång sen.
Koden fungerade klockrent!

Borde det inte förresten vara relativt enkelt att bygga en "fusker"-funktion ovanpå detta?

i7 920 | 12GB DDR3 | GTX 480 | GA-X58A-UD7 | 160GB SSD X25-M G2 | 1TB F3 HD103SJ | W7 64-bit | Mac Mini
Webb: bluekitestudios.com

Trädvy Permalänk
Medlem
Plats
Bromma
Registrerad
Aug 2008

Är inte detta nyggare om man ska vara petnoga?;)

(f | ht)tps?

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007

Det är mer uttrycksfullt, men vet inte om jag tycker det är lika läsbart Men du har helt klart en poäng. Det går nog att fila mer på mönstret.

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Plats
Bromma
Registrerad
Aug 2008
Citat:

Ursprungligen inskrivet av Teknocide
Det är mer uttrycksfullt, men vet inte om jag tycker det är lika läsbart Men du har helt klart en poäng. Det går nog att fila mer på mönstret.

Det går nästan alltid att förbättra:)
Håller med om läsbarheten.. bättre vore:
(ftp | https?)
för läsbarhetens skull:)

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007

Hoppsan! Hittade ett tecken som jag glömt escapa (fetstilt). Ny pattern (med Kurres förändring):

$pattern = '/(ftp|https?):\/\/(\w+:\w+@)?[\w\.]+(:\d+)?[\w\Q.\/?()+-_~#=&%\E]+/';

edit: hade glömt några tecken ( - och _, tillagda nu). kan man ha plustecken i URL:er förresten?

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Feb 2005
Citat:

Ursprungligen inskrivet av Teknocide
Hoppsan! Hittade ett tecken som jag glömt escapa (fetstilt). Ny pattern (med Kurres förändring):

$pattern = '/(ftp|https?):\/\/(\w+:\w+@)?[\w\.]+(:\d+)?[\w\Q.\/?()+-_~#=&%\E]+/';

edit: hade glömt några tecken ( - och _, tillagda nu). kan man ha plustecken i URL:er förresten?

Snyggt! Vet faktiskt inte hur det ligger till med +, hittade dock dessa:

\ / : * ? " " < > | & % . ' # [

i7 920 | 12GB DDR3 | GTX 480 | GA-X58A-UD7 | 160GB SSD X25-M G2 | 1TB F3 HD103SJ | W7 64-bit | Mac Mini
Webb: bluekitestudios.com

Trädvy Permalänk
Medlem
Plats
Bromma
Registrerad
Aug 2008

Jo man kan ha plustecken i URLer, tänk dig postdata

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007

Det verkar gå att dra detta hur långt som helst.. gjorde lite sökningar och hittade:

+-=._/*(),@'$:;&!?

(referens)
Sen ska ju flygande orm (~) och procent också finnas med.. det är 20 tecken.

$pattern = '/(ftp|https?):\/\/(\w+:\w+@)?[\w\.]+(:\d+)?[\w\Q+-=._\/*(),@'$:;&!?~%\E]+/';

Tjusigt värre..

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Plats
Bromma
Registrerad
Aug 2008

Edit: tänkte fel.
Är det inte enklare dock att säga att länken avslutas av ett mellanslag?

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Feb 2005
Citat:

Ursprungligen inskrivet av KurreKula
Edit: tänkte fel.
Är det inte enklare dock att säga att länken avslutas av ett mellanslag?

Kan man säga det med hjälp av " "? Var lägger man i så fall in det i $pattern? Stirrar mig fortfarande blind på några av tecknen där hehe.

i7 920 | 12GB DDR3 | GTX 480 | GA-X58A-UD7 | 160GB SSD X25-M G2 | 1TB F3 HD103SJ | W7 64-bit | Mac Mini
Webb: bluekitestudios.com

Trädvy Permalänk
Medlem
Plats
Bromma
Registrerad
Aug 2008

Nää, i pattern är mellanslag "\s"

Jag tänkte mig nåt i stil med: "((https?|ftp):\/\/|www).[^\s\.]*\..[^\s]*"

Det måste dock pillas med men ni fattar grejen... Kanske inte helt 100% men väldigt mycket enklare!

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase