<?php
error_reporting(E_ALL);

/**
  * Deze functie grijpt standaard alleen hyperlinks (href waardes) uit $_sContent.
  * Met standaard bedoel ik dat we de functie aanroepen met alleen de 1e parameter.
  * 
  * @param string $_sContent				| De tekst waarin we gaan zoeken naar hyperlinks
  * @param boolean $_bCheckHTTP_prefix	| Moeten we controleren of de URL begint met "http://", als een URL hier niet mee begint dan plakken we dit er voor
  * @param boolean $_bWithTrailingSlash		| Mag een URL in het resultaat eindigen met een back-slash?
  * @param boolean $_bGetPlainURL			| Gaan we in de tekst ($_sContent) zoeken naar urls zoals "http://foo.bar", "www.foo.bar" of "http://www.foo.bar"
  * @return mixed						| boolean false (Error) / array (resultaat / lege array geen match)
  *
  * @access public
  */
function get_hyperlinks(	$_sContent,
							$_bCheckHTTP_prefix = true,
							$_bWithTrailingSlash = false,
							$_bGetPlainURL = false
							)
{
	if( empty($_sContent) )
	{
		# Error
		return false;
	}
	
	$sRegexURL	=	'((?:http:\/\/|www\.)' .
					( $_bGetPlainURL ? '{1,2}\w+(?:\.\w+)*(?:\.[a-z]{2,3})?' : '{0,2}(?:\w+(?:\.\w+)*(?:\.[a-z]{2,3})|\d+(?:\.\d+){3}|localhost)' ) .
					'(?:\/[\w.?&=]+)*)(\/)?';
		
	if( !preg_match_all(	'/(<a[^>]*href=(?:"|\'))?[ ]*' .
							$sRegexURL .
							'[ ]*((?:"|\')[^>]*\>(?:.*?)\<[ ]*\/[ ]*a[ ]*\>)?/is', $_sContent, $aMatch) )
	{
		# Geen match
		return array();
	}
			
	//print_r($aMatch);
	//exit;
	
	# Vul de resultaat array
	$aResult = array();
	
	foreach( $aMatch[2] as $k => $v )
	{
		# Ga naar de volgende iteratie als het een anchor is 
		# en we willen plain links hebben en andersom.
		if( ($_bGetPlainURL && !empty($aMatch[1][$k]) && !empty($aMatch[4][$k]))
			|| !$_bGetPlainURL && (empty($aMatch[1][$k]) || empty($aMatch[4][$k])) )
		{
			continue;
		}
		
		$_v = strtolower($v);
		
		if( strpos($_v, ' ') !== false )
		{
			$_v = str_replace(' ', '', $_v);
		}
		
		# Een regex fout fixen
		if( strpos($_v, 'www.http://') === 0 )
		{
			$v = substr(trim($v), 4);
			
			if( $_bGetPlainURL  )
			{
				$aMatch[0][$k] = substr(trim($aMatch[0][$k]), 4);
			}
		}
		elseif( $_bCheckHTTP_prefix && strpos($_v, 'http://') !== 0 )
		{
			$v = 'http://' . $v;
		}

		$aResult[] = array(	'url'	=> $v . ( $_bWithTrailingSlash ? $aMatch[3][$k] : '' ),
							'match'	=> $aMatch[0][$k] );
	}

	unset($aMatch, $_v);
	return $aResult;

} # end function get_hyperlinks

#
# Testen
#

$c = 	' www.plainurl1.nl
		www.http://plainurl2.nl
		<a href="http://www.url1.nl">Goede hyperlink</a>
		<a href="http://www.url2.nl/">Goede hyperlink</a>
		<a href=\'url3.nl\'>Goede hyperlink</a>
		<a href="url4.nl/">Goede hyperlink</a>
		<a href="www.http://url5.nl">Verkeerde hyperlink</a>
		<a href="verkeerd.__/">Verkeerde hyperlink</a>
		<a href="localhost">Goede hyperlink</a>
		<a href="www">Verkeerde hyperlink</a>
		<a href="123.123.123.123">Goede hyperlink</a>
		<a href="foo.bar/map1/map2/plaatje.gif">Goede hyperlink</a>
		<a href="www.foo.bar/map1/map2/plaatjemetslash.gif/">Goede hyperlink</a>
		<a href="http://user.url.com/map1/plaatje.jpg?nats=MTA2MjY6Mzox&content=awdawdad">Goede hyperlink</a>
		plainurl3.nl/
		http://plainurl4.nl/';
		
echo '<pre>';
echo '$c: ' . htmlspecialchars($c) . "\n\n";

echo 'get_hyperlinks($c): (Match href in anchors en haal laatste back-slash uit het url)' . "\n\n";
foreach( get_hyperlinks($c) as $k => $v )
	echo $k . ")\turl: " . $v['url'] . "\n\tmatch: " . htmlspecialchars($v['match']). "\n\n";

echo "\n" . 'get_hyperlinks($c,true,true): (Match href in anchors en laat de laatste back-slash staan in url)' . "\n\n";
foreach( get_hyperlinks($c,true,true) as $k => $v )
	echo $k . ")\turl: " . $v['url'] . "\n\tmatch: " . htmlspecialchars($v['match']). "\n\n";

echo "\n" . 'get_hyperlinks($c,true,false,true): (Match plain URLS in $c en haal laatste back-slash uit het url)' . "\n\n";
foreach( get_hyperlinks($c,true,false,true) as $k => $v )
	echo $k . ")\turl: " . $v['url'] . "\n\tmatch: " . htmlspecialchars($v['match']). "\n\n";

echo "\n" . 'get_hyperlinks($c,true,true,true): (Match plain URLS in $c en laat de laatste back-slash staan in url)' . "\n\n";
foreach( get_hyperlinks($c,true,true,true) as $k => $v )
	echo $k . ")\turl: " . $v['url'] . "\n\tmatch: " . htmlspecialchars($v['match']). "\n\n";

echo '</pre>';
?>