Source of file Links.php
Size: 6,860 Bytes - Last Modified: 2021-12-23T10:25:14+00:00
/var/www/docs.ssmods.com/process/src/thirdparty/HTML_BBCodeParser2/HTML/BBCodeParser2/Filter/Links.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 | <?php /* vim: set expandtab tabstop=4 shiftwidth=4: */ // +----------------------------------------------------------------------+ // | PHP Version 5 | // +----------------------------------------------------------------------+ // | Copyright (c) 1997-2003 The PHP Group | // +----------------------------------------------------------------------+ // | This source file is subject to version 2.02 of the PHP license, | // | that is bundled with this package in the file LICENSE, and is | // | available at through the world-wide-web at | // | http://www.php.net/license/2_02.txt. | // | If you did not receive a copy of the PHP license and are unable to | // | obtain it through the world-wide-web, please send a note to | // | license@php.net so we can mail you a copy immediately. | // +----------------------------------------------------------------------+ // | Author: Stijn de Reede <sjr@gmx.co.uk> | // +----------------------------------------------------------------------+ // // $Id$ // /** * @package HTML_BBCodeParser2 * @author Stijn de Reede <sjr@gmx.co.uk> */ require_once __DIR__ . '/../Filter.php'; /** * */ class HTML_BBCodeParser2_Filter_Links extends HTML_BBCodeParser2_Filter { /** * List of allowed schemes * * @access private * @var array */ var $_allowedSchemes = array('http', 'https', 'ftp', 'irc'); /** * Default scheme * * @access private * @var string */ var $_defaultScheme = 'http'; /** * An array of tags parsed by the engine * * @access private * @var array */ var $_definedTags = array( 'url' => array( 'htmlopen' => 'a', 'htmlclose' => 'a', 'allowed' => 'none^img', 'attributes'=> array('url' => 'href=%2$s%1$s%2$s', 't' => 'target=%2$s%1$s%2$s') ) ); /** * Executes statements before the actual array building starts * * This method should be overwritten in a filter if you want to do * something before the parsing process starts. This can be useful to * allow certain short alternative tags which then can be converted into * proper tags with preg_replace() calls. * The main class walks through all the filters and and calls this * method if it exists. The filters should modify their private $_text * variable. * * @return none * @access private * @see $_text * @author Stijn de Reede <sjr@gmx.co.uk> * @author Seth Price <seth@pricepages.org> */ function _preparse() { $options = $this->_options; $o = $options['open']; $c = $options['close']; $oe = $options['open_esc']; $ce = $options['close_esc']; $schemes = implode('|', $this->_allowedSchemes); $pattern = array( "/(?<![\"'=".$ce."\/])(".$oe."[^".$ce."]*".$ce.")?(((".$schemes."):\/\/|www)[@-a-z0-9.]+\.[a-z]{2,4}[^\s()\[\]]*)/i", "!".$oe."url(".$ce."|\s.*".$ce.")(.*)".$oe."/url".$ce."!iU", "!".$oe."url=((([a-z]*:(//)?)|www)[@-a-z0-9.]+)([^\s\[\]]*)".$ce."(.*)".$oe."/url".$ce."!i"); $pp = preg_replace_callback($pattern[0], array($this, 'smarterPPLinkExpand'), $this->_text); $pp = preg_replace($pattern[1], $o."url=\$2\$1\$2".$o."/url".$c, $pp); $this->_preparsed = preg_replace_callback($pattern[2], array($this, 'smarterPPLink'), $pp); } /** * Intelligently expand a URL into a link * * @return string * @access private * @author Seth Price <seth@pricepages.org> * @author Lorenzo Alberton <l.alberton@quipo.it> */ function smarterPPLinkExpand($matches) { $options = $this->_options; $o = $options['open']; $c = $options['close']; $oe = $options['open_esc']; $ce = $options['close_esc']; //If we have an intro tag that is [url], then skip this match if (preg_match("/".$oe."url(=[^\s()\[\]=]+)?".$ce."/i", $matches[1])) { return $matches[0]; } $punctuation = '.,;:'; // Links can't end with these chars $trailing = ''; // Knock off ending punctuation $last = substr($matches[2], -1); while (strpos($punctuation, $last) !== false) { // Last character is punctuation - remove it from the url $trailing = $last.$trailing; $matches[2] = substr($matches[2], 0, -1); $last = substr($matches[2], -1); } $off = strpos($matches[2], ':'); //Is a ":" (therefore a scheme) defined? if ($off === false) { /* * Create a link with the default scheme of http. Notice that the * text that is viewable to the user is unchanged, but the link * itself contains the "http://". */ return $matches[1].$o.'url='.$this->_defaultScheme.'://'.$matches[2].$c.$matches[2].$o.'/url'.$c.$trailing; } $scheme = substr($matches[2], 0, $off); /* * If protocol is in the approved list than allow it. Note that this * check isn't really needed, but the created link will just be deleted * later in smarterPPLink() if we create it now and it isn't on the * scheme list. */ if (in_array($scheme, $this->_allowedSchemes)) { return $matches[1].$o.'url'.$c.$matches[2].$o.'/url'.$c.$trailing; } return $matches[0]; } /** * Finish preparsing URL to clean it up * * @return string * @access private * @author Seth Price <seth@pricepages.org> */ function smarterPPLink($matches) { $options = $this->_options; $o = $options['open']; $c = $options['close']; $urlServ = $matches[1]; $path = $matches[5]; $off = strpos($urlServ, ':'); if ($off === false) { //Default to http $urlServ = $this->_defaultScheme.'://'.$urlServ; $off = strpos($urlServ, ':'); } //Add trailing slash if missing (to create a valid URL) if (!$path) { $path = '/'; } $protocol = substr($urlServ, 0, $off); if (in_array($protocol, $this->_allowedSchemes)) { //If protocol is in the approved list than allow it return $o.'url='.$urlServ.$path.$c.$matches[6].$o.'/url'.$c; } //Else remove url tag return $matches[6]; } } ?> |