Permalänk
Medlem

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!

Visa signatur

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

Permalänk
Medlem

$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.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

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

Visa signatur

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

Permalänk
Medlem

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

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

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.

Visa signatur

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

Permalänk

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

Visa signatur

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

Permalänk
Medlem

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.

Visa signatur

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

Permalänk
Medlem
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]+/';

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

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?

Visa signatur

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

Permalänk

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

(f | ht)tps?

Visa signatur

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

Permalänk
Medlem

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.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
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:)

Visa signatur

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

Permalänk
Medlem

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?

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
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:

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

Visa signatur

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

Permalänk

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

Visa signatur

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

Permalänk
Medlem

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..

Visa signatur

Kom-pa-TI-bilitet

Permalänk

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

Visa signatur

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

Permalänk
Medlem
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.

Visa signatur

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

Permalänk

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!

Visa signatur

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