login  Naam:   Wachtwoord: 
Registreer je!
 Forum

RegEx werkt niet (Opgelost)

Offline Rens - 22/04/2008 15:52
Avatar van RensGouden medaille

Crew algemeen
Hoi,

Ik ben bezig met een UBB parser.
Nu wil ik die parser ook urls kunnen laten parsen ([url..][/url]).
Het werkt, maar nu wil ik er nog een check overheen gooien om te kijken of de url wel echt een url is.
Hier gaat het de hele tijd verkeerd.

Ik heb de volgende code:
  1. function validateURL($pURL)
  2. {
  3. return(preg_match("/^https?:\/\/([a-z0-9\-@]+\.?):?\.([a-z]{2,4}|[a-z]{2,4}:[0-9]{1,6})\/?$/i", $pURL));
  4. }
  5.  
  6. function makeUrl($sLink, $sText = '')
  7. {
  8. return $sLink." - ".$this->validateURL($sLink);
  9. }
  10.  
  11. function parse_urls($sInput)
  12. {
  13. $sOutput = preg_replace("~\[url\](.*?)\[\/url\]~sie", "\$this->makeUrl('\\1')", $sInput);
  14. return preg_replace("~\[url\=(.*?)\](.*?)\[\/url\]~sie", "\$this->makeUrl('\\1', '\\2')", $sOutput);
  15. }

De regex die ik gebruik is op het moment die van Tri Pham:
http://www.site...amp;id=484
Maar heb ook al de regex van FangorN gebruikt:
http://www.site...&id=79
Krijg bij allebei de regex's telkens dat het geen url is:
Citaat:
http://www.test.nl/ - 0
www.test.nl - 0
test.nl - 0
http://www.test.nl - 0
www.test.nl - 0
test.nl - 0
blaat - 0
blaat - 0

(De 0 is het resultaat, false...)

Kan iemand me vertellen waarom?
Ik word er gek van 
Bedankt.

6 antwoorden

Gesponsorde links
Offline jc2 - 22/04/2008 16:21 (laatste wijziging 22/04/2008 16:22)
Avatar van jc2 PHP interesse wat geeft hij aan bij 'https://www.test.nl'?
zoals ik het zogauw zie, keurt hij alleen https-urls goed, maar dit weet ik niet zeker aangezien ik geen expert op het gebied van regex's ben.
Offline Rens - 22/04/2008 16:26
Avatar van Rens Gouden medaille

Crew algemeen
Nope, die doet het ook niet... 
Offline Kr4nKz1n - 22/04/2008 16:57
Avatar van Kr4nKz1n Onbekend Haal de slash (/) aan het begin weg en de slash en i (/i) aan het einde eens weg.
Offline Rens - 22/04/2008 16:58 (laatste wijziging 22/04/2008 17:22)
Avatar van Rens Gouden medaille

Crew algemeen
Die / is de delimeter, die bepaald het begin en het einde van de regex...
Als ik die weghaal krijg ik fouten.

edit; Gebruik nu de volgende functies en die werken wel:
  1. function validateURL($url_val)
  2. {
  3. $url_pattern = "https?\:\/\/[[:alnum:]\-\.]+(\.[[:alpha:]]{2,4})+";
  4. $url_pattern .= "(\/[\w\-]+)*"; // folders like /val_1/45/
  5. $url_pattern .= "((\/[\w\-\.]+\.[[:alnum:]]{2,4})?"; // filename like index.html
  6. $url_pattern .= "|"; // end with filename or ?
  7. $url_pattern .= "\/?)"; // trailing slash or not
  8. $error_count = 0;
  9. if(strpos($url_val, "?"))
  10. {
  11. $url_parts = explode("?", $url_val);
  12. if(!preg_match("/^".$url_pattern."$/", $url_parts[0]))
  13. {
  14. $error_count++;
  15. }
  16. if(!preg_match("/^(&?[\w\-]+=\w*)+$/", $url_parts[1]))
  17. {
  18. $error_count++;
  19. }
  20. } else
  21. {
  22. if(!preg_match("/^".$url_pattern."$/", $url_val))
  23. {
  24. $error_count++;
  25. }
  26. }
  27. return ($error_count > 0) ? 0 : 1;
  28. }
  29.  
  30. function makeUrl($sLink, $sText = '')
  31. {
  32. if(subStr($sLink, 0, 7) != "http://")
  33. {
  34. $sLinkToCheck = "http://".$sLink;
  35. } else
  36. {
  37. $sLinkToCheck = $sLink;
  38. }
  39. if($this->validateURL($sLinkToCheck))
  40. {
  41. if(empty($sText))
  42. {
  43. $sRet = '<a href="'.$sLinkToCheck.'">'.$sLink.'</a>';
  44. } else
  45. {
  46. $sRet = '<a href="'.$sLinkToCheck.'">'.$sText.'</a>';
  47. }
  48. } else
  49. {
  50. if(empty($sText))
  51. {
  52. $sRet = '[url]'.$sLink.'[/url]';
  53. } else
  54. {
  55. $sRet = '[url='.$sLink.']'.$sText.'[/url]';
  56. }
  57. }
  58. return $sRet;
  59. }
Offline Kr4nKz1n - 22/04/2008 17:34 (laatste wijziging 22/04/2008 17:35)
Avatar van Kr4nKz1n Onbekend De ^ bepaald het begin en de $ het einde van de regex.

Heb je het al wel getest ?
Offline Rens - 22/04/2008 17:41 (laatste wijziging 22/04/2008 19:26)
Avatar van Rens Gouden medaille

Crew algemeen
Ja.

edit; Nog net iets meer aangepast, en nu werkt het zoals het hoort:
  1. function validateURL($url_val)
  2. {
  3. $url_pattern = "((http|https|ftp)\:\/\/)?[[:alnum:]\-\.]+(\.[[:alpha:]]{2,4})+";
  4. $url_pattern .= "(\/[\w\-]+)*"; // folders like /val_1/45/
  5. $url_pattern .= "((\/[\w\-\.]+\.[[:alnum:]]{2,4})?"; // filename like index.html
  6. $url_pattern .= "|"; // end with filename or ?
  7. $url_pattern .= "\/?)"; // trailing slash or not
  8. $error_count = 0;
  9. if(strpos($url_val, "?"))
  10. {
  11. $url_parts = explode("?", $url_val);
  12. if(!preg_match("/^".$url_pattern."$/", $url_parts[0]))
  13. {
  14. $error_count++;
  15. }
  16. if(!preg_match("/^(&?[\w\-]+=\w*)+$/", $url_parts[1]))
  17. {
  18. $error_count++;
  19. }
  20. } else
  21. {
  22. if(!preg_match("/^".$url_pattern."$/", $url_val))
  23. {
  24. $error_count++;
  25. }
  26. }
  27. return ($error_count > 0) ? 0 : 1;
  28. }
  29.  
  30. function makeUrl($sLink, $sText = '')
  31. {
  32. if($this->validateURL($sLink))
  33. {
  34. if(ereg("^(http://|ftp://|https://)", $sLink))
  35. {
  36. $sOutput = $sLink;
  37. } else
  38. {
  39. if(ereg("^ftp.", $sLink))
  40. {
  41. $sOutput = "ftp://".$sLink;
  42. } else
  43. {
  44. $sOutput = "http://".$sLink;
  45. }
  46. }
  47. if(empty($sText))
  48. {
  49. $sRet = '<a href="'.$sOutput.'" target="_blank">'.$sLink.'</a>';
  50. } else
  51. {
  52. $sRet = '<a href="'.$sOutput.'" target="_blank">'.$sText.'</a>';
  53. }
  54. } else
  55. {
  56. $sRet = $sLink;
  57. }
  58. return $sRet;
  59. }
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.461s