123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- <?php
-
- /**
- +-----------------------------------------------------------------------+
- | This file is part of the Roundcube Webmail client |
- | Copyright (C) 2005-2012, The Roundcube Dev Team |
- | |
- | Licensed under the GNU General Public License version 3 or |
- | any later version with exceptions for skins & plugins. |
- | See the README file for a full license statement. |
- | |
- | PURPOSE: |
- | Provide basic functions for base URL replacement |
- +-----------------------------------------------------------------------+
- | Author: Thomas Bruederli <roundcube@gmail.com> |
- +-----------------------------------------------------------------------+
- */
-
- /**
- * Helper class to turn relative urls into absolute ones
- * using a predefined base
- *
- * @package Framework
- * @subpackage Utils
- * @author Thomas Bruederli <roundcube@gmail.com>
- */
- class rcube_base_replacer
- {
- private $base_url;
-
-
- /**
- * Class constructor
- *
- * @param string $base Base URL
- */
- public function __construct($base)
- {
- $this->base_url = $base;
- }
-
- /**
- * Replace callback
- *
- * @param array $matches Matching entries
- *
- * @return string Replaced text with absolute URL
- */
- public function callback($matches)
- {
- return $matches[1] . '="' . self::absolute_url($matches[3], $this->base_url) . '"';
- }
-
- /**
- * Convert base URLs to absolute ones
- *
- * @param string $body Text body
- *
- * @return string Replaced text
- */
- public function replace($body)
- {
- $regexp = array(
- '/(src|background|href)=(["\']?)([^"\'\s>]+)(\2|\s|>)/i',
- '/(url\s*\()(["\']?)([^"\'\)\s]+)(\2)\)/i',
- );
-
- return preg_replace_callback($regexp, array($this, 'callback'), $body);
- }
-
- /**
- * Convert paths like ../xxx to an absolute path using a base url
- *
- * @param string $path Relative path
- * @param string $base_url Base URL
- *
- * @return string Absolute URL
- */
- public static function absolute_url($path, $base_url)
- {
- // check if path is an absolute URL
- if (preg_match('/^[fhtps]+:\/\//', $path)) {
- return $path;
- }
-
- // check if path is a content-id scheme
- if (strpos($path, 'cid:') === 0) {
- return $path;
- }
-
- $host_url = $base_url;
- $abs_path = $path;
-
- // cut base_url to the last directory
- if (strrpos($base_url, '/') > 7) {
- $host_url = substr($base_url, 0, strpos($base_url, '/', 7));
- $base_url = substr($base_url, 0, strrpos($base_url, '/'));
- }
-
- // $path is absolute
- if ($path[0] == '/') {
- $abs_path = $host_url.$path;
- }
- else {
- // strip './' because its the same as ''
- $path = preg_replace('/^\.\//', '', $path);
-
- if (preg_match_all('/\.\.\//', $path, $matches, PREG_SET_ORDER)) {
- $cnt = count($matches);
- while ($cnt--) {
- if ($pos = strrpos($base_url, '/')) {
- $base_url = substr($base_url, 0, $pos);
- }
- $path = substr($path, 3);
- }
- }
-
- $abs_path = $base_url.'/'.$path;
- }
-
- return $abs_path;
- }
- }
|