PageRenderTime 43ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/spip/ecrire/inc/filtres_mini.php

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