login  Naam:   Wachtwoord: 
Registreer je!
 Forum

[Regex] URI (Opgelost)

Offline MiST - 19/08/2009 00:07 (laatste wijziging 19/08/2009 00:09)
Avatar van MiSTLid Hello,

Hier is de uitdaging voor de übergeek (Regexen zijn zooooo de Heilige graal )

Ik ben een shoutbox aan het maken (met ZF, lekker ). Daar is niets aan. MAAR! Ik wil dat de ingevoerde tekst afgezocht wordt naar URI's om die dan te formatten als HTML A-tags.

Ik heb een hele mooie regex gemaakt tot nu toe die voor heel veel gevallen werkt. Maar hij heeft nog enkele kinderziektes ook.

aanschouw mijn joekel!

  1. $pattern = '#((http|https|ftp)://)*([\w\d]+\.)*([\w\d]+\.\w{2,4})(/[\w\d\?&=\+\*\.-]*)*#si';


Die wordt vervangen met:

  1. $replacement = preg_match('#((http|https|ftp)://)#si', '$1$3$4$5') ? '<a href="$1$3$4$5">$1$3$4$5</a>' : '<a href="http://$3$4$5">$3$4$5</a>';


Dit werkt voor heel veel adressen (en ik zou nog IP-adressen en poortnummers kunnen toevoegen. Het jammere is...

* domeinen van emails worden geformat... (dat wil ik niet)
* als je na een punt geen spatie typt, heb je een link. Nuja, das niet zo'n probleem. Dan moeten de mensen maar leren typen 

een hoedje plaatsen lost niets op, want dan worden URLS in het midden van de tekst niet geformat.

Iemand een idee? 

8 antwoorden

Gesponsorde links
Offline Richard - 19/08/2009 00:25
Avatar van Richard Crew algemeen (?<!@) misschien? ;p Erg simpele oplossing maar dat is precies waar je om vraagt :]
Offline darsstar - 19/08/2009 00:31 (laatste wijziging 19/08/2009 12:35)
Avatar van darsstar Nieuw lid probeer de volgende eens (nee, ik heb deze niet gemaakt):
{(?<=\b)((?:https?|ftp)://|www\.)[\w.]+[;#&/~=\w+()?.,:%-]*[;#&/~=\w+(-]}i

verder even over jouw 'joekel'.
((http|https|ftp)://)*
http://https://ftp://http://www.example.com zal dus ook werken. probeer een plus teken
verder kun je ook non-captured subpattern maken door na het openings haakje "?:" neer te zetten, de inhoud komt dan dus niet meer in een $n terecht.

([\w\d]+\.)*
\d zit volgens mij mij \w inbegrepen

([\w\d]+\.\w{2,4})
die bovenstaande

(/[\w\d\?&=\+\*\.-]*)*
zie bovenstaande
?, +, * en . hoeven binnen square brackets niet gebackslashes worden.

met wat verbeteringen krijg ik de volgende regex:
#((?:(?:http|https|ftp)://)?(?:[\w]+\.)*(?:[\w]+\.\w{2,4})(?:/[\w?&=+*.-]*)*)#si
Offline Richard - 19/08/2009 09:14
Avatar van Richard Crew algemeen Noem je dat verbeterd? :')

  1. '~(?<!@)(?:(?:(?:ht|f)tps?|ftp)://)?(?:\w+\.)*(?:\w+\.[a-z]{2,6})(?:/[\w?&=+*.-]*)*~i'
Offline MiST - 19/08/2009 12:47 (laatste wijziging 19/08/2009 12:48)
Avatar van MiST Lid We zijn er bijna denk ik...

Het truukje lijkt wel niet te werken... Wat gaat er verkeerd? 

wat ik nu heb:

  1. $patterns[0] = '~(?<!@)((?:(?:ht|f)tps?|ftp)://)?(\w+\.)*(\w+\.[a-z]{2,6})((/[\w\d?&=+*.-]*)*)~i'


met replacement:

  1. $replacements[0] = preg_match('#(?:(?:(?:ht|f)tps?|ftp)://)#si', '$1$2$3$4') ? '<a href="$1$2$3$4">$1$2$3$4</a>' : '<a href="http://$2$3$4">$2$3$4</a>';


Wat er nu gebeurt. Bij een emailadres wordt nu het eerste karakter van het domein overgeslagen, maar de rest wordt nog steeds geformat dus alias@domein.extensie wordt alias@domein.extensie

Da's niet echt de bedoeling 

Kan iemand mij nog verduidelijken:
* wat de i achteraan doet? de tilde is obviously de delimiter
* Hoe dat truukje (met de @) eigenlijk zou moeten werken?

Ik ben geen Regex-Held, JeXuS is dat, zo te zien aan zijn omschrijving...  Alle hulp is welkom though.

Offline Richard - 19/08/2009 12:55
Avatar van Richard Crew algemeen Jaja, ik zie het probleem al, raar dat ik daar niet aan dacht :-)

Meestal wordt dit opgelost met: (?<=^|\s) in plaats van die (?<!@) 
Offline MiST - 19/08/2009 13:58
Avatar van MiST Lid *probeert* *ziet dat het werkt* *blij*

JeXuS, jij bent mijn held! 

Als je nu ook nog even kan uitleggen wat het allemaal exact doet... 

Ik begrijp graag alles wat ik gebruik, eerder dan het klakkeloos over te nemen (zoals nu een beetje 8-))
Offline Richard - 19/08/2009 14:04
Avatar van Richard Crew algemeen
  1. (?<= # Assert that the regex below can be matched, with the match ending at this position (positive lookbehind)
  2. # Match either the regular expression below (attempting the next alternative only if this one fails)
  3. ^ # Assert position at the beginning of a line (at beginning of the string or after a line break character)
  4. | # Or match regular expression number 2 below (the entire group fails if this one fails to match)
  5. \s # Match a single character that is a “whitespace character” (spaces, tabs, line breaks, etc.)
  6. )
  7. ( # Match the regular expression below and capture its match into backreference number 1
  8. (?: # Match the regular expression below
  9. # Match either the regular expression below (attempting the next alternative only if this one fails)
  10. (?: # Match the regular expression below
  11. # Match either the regular expression below (attempting the next alternative only if this one fails)
  12. ht # Match the characters “ht” literally
  13. | # Or match regular expression number 2 below (the entire group fails if this one fails to match)
  14. f # Match the character “f” literally
  15. )
  16. tp # Match the characters “tp” literally
  17. s # Match the character “s” literally
  18. ? # Between zero and one times, as many times as possible, giving back as needed (greedy)
  19. | # Or match regular expression number 2 below (the entire group fails if this one fails to match)
  20. ftp # Match the characters “ftp” literally
  21. )
  22. :// # Match the characters “://” literally
  23. )? # Between zero and one times, as many times as possible, giving back as needed (greedy)
  24. ( # Match the regular expression below and capture its match into backreference number 2
  25. \w # Match a single character that is a “word character” (letters, digits, etc.)
  26. + # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
  27. \. # Match the character “.” literally
  28. )* # Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
  29. (?: # Match the regular expression below
  30. \w # Match a single character that is a “word character” (letters, digits, etc.)
  31. + # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
  32. \. # Match the character “.” literally
  33. [a-z] # Match a single character in the range between “a” and “z”
  34. {2,6} # Between 2 and 6 times, as many times as possible, giving back as needed (greedy)
  35. )
  36. (?: # Match the regular expression below
  37. ( # Match the regular expression below and capture its match into backreference number 3
  38. / # Match the character “/” literally
  39. [\w?&=+*.-] # Match a single character present in the list below
  40. # A word character (letters, digits, etc.)
  41. # One of the characters “?&=+*”
  42. # The character “.”
  43. # The character “-”
  44. * # Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
  45. )*+ # Between zero and unlimited times, as many times as possible, without giving back (possessive)
  46. )


:-)
Offline MiST - 19/08/2009 17:40
Avatar van MiST Lid w00t! 
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.223s