[SPIP] ~maj v2.1.25-->2.1.26
[velocampus/web/www.git] / www / ecrire / inc / filtres_mini.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2014 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13
14 if (!defined('_ECRIRE_INC_VERSION')) return;
15
16 //
17 // Filtres d'URLs
18 //
19
20 // Nettoyer une URL contenant des ../
21 //
22 // resolve_url('/.././/truc/chose/machin/./.././.././hopla/..');
23 // inspire (de loin) par PEAR:NetURL:resolvePath
24 //
25 // http://doc.spip.org/@resolve_path
26 function resolve_path($url_o) {
27 preg_match('@^([^?]*)(.*)$@', $url_o, $regs);
28 list(,$url, $query) = $regs;
29 while (preg_match(',/\.?/,', $url, $regs) # supprime // et /./
30 OR preg_match(',/[^/]*/\.\./,S', $url, $regs) # supprime /toto/../
31 OR preg_match(',^/\.\./,S', $url, $regs)) # supprime les /../ du haut
32 $url = str_replace($regs[0], '/', $url);
33
34 return '/'.preg_replace(',^/,S', '', $url . $query);
35 }
36
37 //
38 // Suivre un lien depuis une adresse donnee -> nouvelle adresse
39 //
40 // suivre_lien('http://rezo.net/sous/dir/../ect/ory/fi.html..s#toto',
41 // 'a/../../titi.coco.html/tata#titi');
42 // http://doc.spip.org/@suivre_lien
43 function suivre_lien($url, $lien) {
44
45 if (preg_match(',^(mailto|javascript):,iS', $lien))
46 return $lien;
47 if (preg_match(',^([a-z0-9]+://.*?)(/.*)?$,iS', $lien, $r))
48 return $r[1].resolve_path($r[2]);
49
50 # L'url site spip est un lien absolu aussi
51 if ($lien == $GLOBALS['meta']['adresse_site']){
52 return $lien;
53 }
54
55 # lien relatif, il faut verifier l'url de base
56 # commencer par virer la chaine de get de l'url de base
57 if (preg_match(',^(.*?://[^/]+)(/.*?/?)?([^/#?]*)([?][^#]*)?(#.*)?$,S', $url, $regs)) {
58 $debut = $regs[1];
59 $dir = !strlen($regs[2]) ? '/' : $regs[2];
60 $mot = $regs[3];
61 $get = isset($regs[4])?$regs[4]:"";
62 $hash = isset($regs[5])?$regs[5]:"";
63 }
64 #var_dump(array('url'=>$url,'debut'=>$debut,'dir'=>$dir,'mot'=>$mot,'get'=>$get,'hash'=>$hash));
65 switch (substr($lien,0,1)) {
66 case '/':
67 return $debut . resolve_path($lien);
68 case '#':
69 return $debut . resolve_path($dir.$mot.$get.$lien);
70 case '':
71 return $debut . resolve_path($dir.$mot.$get.$hash);
72 default:
73 return $debut . resolve_path($dir.$lien);
74 }
75 }
76
77 // un filtre pour transformer les URLs relatives en URLs absolues ;
78 // ne s'applique qu'aux #URL_XXXX
79 // http://doc.spip.org/@url_absolue
80 function url_absolue($url, $base='') {
81 if (strlen($url = trim($url)) == 0)
82 return '';
83 if (!$base)
84 $base = url_de_base() . (_DIR_RACINE ? _DIR_RESTREINT_ABS : '');
85 return suivre_lien($base, $url);
86 }
87
88 // un filtre pour transformer les URLs relatives en URLs absolues ;
89 // ne s'applique qu'aux textes contenant des liens
90 // http://doc.spip.org/@liens_absolus
91 function liens_absolus($texte, $base='') {
92 if (preg_match_all(',(<(a|link|image)[[:space:]]+[^<>]*href=["\']?)([^"\' ><[:space:]]+)([^<>]*>),imsS',
93 $texte, $liens, PREG_SET_ORDER)) {
94 foreach ($liens as $lien) {
95 $abs = url_absolue($lien[3], $base);
96 if ($abs <> $lien[3] and !preg_match('/^#/',$lien[3]))
97 $texte = str_replace($lien[0], $lien[1].$abs.$lien[4], $texte);
98 }
99 }
100 if (preg_match_all(',(<(img|script)[[:space:]]+[^<>]*src=["\']?)([^"\' ><[:space:]]+)([^<>]*>),imsS',
101 $texte, $liens, PREG_SET_ORDER)) {
102 foreach ($liens as $lien) {
103 $abs = url_absolue($lien[3], $base);
104 if ($abs <> $lien[3])
105 $texte = str_replace($lien[0], $lien[1].$abs.$lien[4], $texte);
106 }
107 }
108 return $texte;
109 }
110
111 //
112 // Ce filtre public va traiter les URL ou les <a href>
113 //
114 // http://doc.spip.org/@abs_url
115 function abs_url($texte, $base='') {
116 if ($GLOBALS['mode_abs_url'] == 'url')
117 return url_absolue($texte, $base);
118 else
119 return liens_absolus($texte, $base);
120 }
121
122
123 ?>