url-grijpen
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<?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>';
?>
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>';
?>