RegEx werkt niet (Opgelost)
Rens - 22/04/2008 15:52
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:
function validateURL($pURL)
{
return(preg_match("/^https?:\/\/([a-z0-9\-@]+\.?):?\.([a-z]{2,4}|[a-z]{2,4}:[0-9]{1,6})\/?$/i", $pURL));
}
function makeUrl($sLink, $sText = '')
{
return $sLink." - ".$this->validateURL($sLink);
}
function parse_urls($sInput)
{
$sOutput = preg_replace("~\[url\](.*?)\[\/url\]~sie", "\$this->makeUrl('\\1')", $sInput);
return preg_replace("~\[url\=(.*?)\](.*?)\[\/url\]~sie", "\$this->makeUrl('\\1', '\\2')", $sOutput);
}
function validateURL( $pURL )
{
return ( preg_match ( "/^https?:\/\/([a-z0-9\-@]+\.?):?\.([a-z]{2,4}|[a-z]{2,4}:[0-9]{1,6})\/?$/i" , $pURL ) ) ; }
function makeUrl( $sLink , $sText = '' )
{
return $sLink . " - " . $this -> validateURL ( $sLink ) ;
}
function parse_urls( $sInput )
{
$sOutput = preg_replace ( "~\[url\](.*?)\[\/url\]~sie" , "\$ this->makeUrl('\\1 ')" , $sInput ) ; return preg_replace ( "~\[url\=(.*?)\](.*?)\[\/url\]~sie" , "\$ this->makeUrl('\\1 ', '\\2 ')" , $sOutput ) ; }
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:
(De 0 is het resultaat, false...)
Kan iemand me vertellen waarom?
Ik word er gek van
Bedankt.
6 antwoorden
Gesponsorde links
jc2 - 22/04/2008 16:21 (laatste wijziging 22/04/2008 16:22)
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.
Kr4nKz1n - 22/04/2008 16:57
Onbekend
Haal de slash (/) aan het begin weg en de slash en i (/i) aan het einde eens weg.
Rens - 22/04/2008 16:58 (laatste wijziging 22/04/2008 17:22)
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:
function validateURL($url_val)
{
$url_pattern = "https?\:\/\/[[:alnum:]\-\.]+(\.[[:alpha:]]{2,4})+";
$url_pattern .= "(\/[\w\-]+)*"; // folders like /val_1/45/
$url_pattern .= "((\/[\w\-\.]+\.[[:alnum:]]{2,4})?"; // filename like index.html
$url_pattern .= "|"; // end with filename or ?
$url_pattern .= "\/?)"; // trailing slash or not
$error_count = 0;
if(strpos($url_val, "?"))
{
$url_parts = explode("?", $url_val);
if(!preg_match("/^".$url_pattern."$/", $url_parts[0]))
{
$error_count++;
}
if(!preg_match("/^(&?[\w\-]+=\w*)+$/", $url_parts[1]))
{
$error_count++;
}
} else
{
if(!preg_match("/^".$url_pattern."$/", $url_val))
{
$error_count++;
}
}
return ($error_count > 0) ? 0 : 1;
}
function makeUrl($sLink, $sText = '')
{
if(subStr($sLink, 0, 7) != "http://")
{
$sLinkToCheck = "http://".$sLink;
} else
{
$sLinkToCheck = $sLink;
}
if($this->validateURL($sLinkToCheck))
{
if(empty($sText))
{
$sRet = '<a href="'.$sLinkToCheck.'">'.$sLink.'</a>';
} else
{
$sRet = '<a href="'.$sLinkToCheck.'">'.$sText.'</a>';
}
} else
{
if(empty($sText))
{
$sRet = '[url]'.$sLink.'[/url]';
} else
{
$sRet = '[url='.$sLink.']'.$sText.'[/url]';
}
}
return $sRet;
}
function validateURL( $url_val )
{
$url_pattern = "https?\:\/\/[[:alnum:]\-\.]+(\.[[:alpha:]]{2,4})+" ;
$url_pattern .= "(\/[\w\-]+)*" ; // folders like /val_1/45/
$url_pattern .= "((\/[\w\-\.]+\.[[:alnum:]]{2,4})?" ; // filename like index.html
$url_pattern .= "|" ; // end with filename or ?
$url_pattern .= "\/?)" ; // trailing slash or not
$error_count = 0 ;
{
$url_parts = explode ( "?" , $url_val ) ; if ( ! preg_match ( "/^" . $url_pattern . "$/" , $url_parts [ 0 ] ) ) {
$error_count ++;
}
if ( ! preg_match ( "/^(&?[\w\-]+=\w*)+$/" , $url_parts [ 1 ] ) ) {
$error_count ++;
}
} else
{
{
$error_count ++;
}
}
return ( $error_count > 0 ) ? 0 : 1 ;
}
function makeUrl( $sLink , $sText = '' )
{
if ( subStr ( $sLink , 0 , 7 ) != "http://" ) {
$sLinkToCheck = "http://" . $sLink ;
} else
{
$sLinkToCheck = $sLink ;
}
if ( $this -> validateURL ( $sLinkToCheck ) )
{
{
$sRet = '<a href="' . $sLinkToCheck . '">' . $sLink . '</a>' ;
} else
{
$sRet = '<a href="' . $sLinkToCheck . '">' . $sText . '</a>' ;
}
} else
{
{
$sRet = '[url]' . $sLink . '[/url]' ;
} else
{
$sRet = '[url=' . $sLink . ']' . $sText . '[/url]' ;
}
}
return $sRet ;
}
Kr4nKz1n - 22/04/2008 17:34 (laatste wijziging 22/04/2008 17:35)
Onbekend
De ^ bepaald het begin en de $ het einde van de regex.
Heb je het al wel getest ?
Rens - 22/04/2008 17:41 (laatste wijziging 22/04/2008 19:26)
Crew algemeen
Ja.
edit; Nog net iets meer aangepast, en nu werkt het zoals het hoort:
function validateURL($url_val)
{
$url_pattern = "((http|https|ftp)\:\/\/)?[[:alnum:]\-\.]+(\.[[:alpha:]]{2,4})+";
$url_pattern .= "(\/[\w\-]+)*"; // folders like /val_1/45/
$url_pattern .= "((\/[\w\-\.]+\.[[:alnum:]]{2,4})?"; // filename like index.html
$url_pattern .= "|"; // end with filename or ?
$url_pattern .= "\/?)"; // trailing slash or not
$error_count = 0;
if(strpos($url_val, "?"))
{
$url_parts = explode("?", $url_val);
if(!preg_match("/^".$url_pattern."$/", $url_parts[0]))
{
$error_count++;
}
if(!preg_match("/^(&?[\w\-]+=\w*)+$/", $url_parts[1]))
{
$error_count++;
}
} else
{
if(!preg_match("/^".$url_pattern."$/", $url_val))
{
$error_count++;
}
}
return ($error_count > 0) ? 0 : 1;
}
function makeUrl($sLink, $sText = '')
{
if($this->validateURL($sLink))
{
if(ereg("^(http://|ftp://|https://)", $sLink))
{
$sOutput = $sLink;
} else
{
if(ereg("^ftp.", $sLink))
{
$sOutput = "ftp://".$sLink;
} else
{
$sOutput = "http://".$sLink;
}
}
if(empty($sText))
{
$sRet = '<a href="'.$sOutput.'" target="_blank">'.$sLink.'</a>';
} else
{
$sRet = '<a href="'.$sOutput.'" target="_blank">'.$sText.'</a>';
}
} else
{
$sRet = $sLink;
}
return $sRet;
}
function validateURL( $url_val )
{
$url_pattern = "((http|https|ftp)\:\/\/)?[[:alnum:]\-\.]+(\.[[:alpha:]]{2,4})+" ;
$url_pattern .= "(\/[\w\-]+)*" ; // folders like /val_1/45/
$url_pattern .= "((\/[\w\-\.]+\.[[:alnum:]]{2,4})?" ; // filename like index.html
$url_pattern .= "|" ; // end with filename or ?
$url_pattern .= "\/?)" ; // trailing slash or not
$error_count = 0 ;
{
$url_parts = explode ( "?" , $url_val ) ; if ( ! preg_match ( "/^" . $url_pattern . "$/" , $url_parts [ 0 ] ) ) {
$error_count ++;
}
if ( ! preg_match ( "/^(&?[\w\-]+=\w*)+$/" , $url_parts [ 1 ] ) ) {
$error_count ++;
}
} else
{
{
$error_count ++;
}
}
return ( $error_count > 0 ) ? 0 : 1 ;
}
function makeUrl( $sLink , $sText = '' )
{
if ( $this -> validateURL ( $sLink ) )
{
if ( ereg ( "^(http://|ftp://|https://)" , $sLink ) ) {
$sOutput = $sLink ;
} else
{
if ( ereg ( "^ftp." , $sLink ) ) {
$sOutput = "ftp://" . $sLink ;
} else
{
$sOutput = "http://" . $sLink ;
}
}
{
$sRet = '<a href="' . $sOutput . '" target="_blank">' . $sLink . '</a>' ;
} else
{
$sRet = '<a href="' . $sOutput . '" target="_blank">' . $sText . '</a>' ;
}
} else
{
$sRet = $sLink ;
}
return $sRet ;
}
Gesponsorde links
Dit onderwerp is gesloten .