Эта тема на forum.dklab.ru


Smilies_: Нужно изменить HTML_BBCodeParser из PEAR. Как исправить?
ужно изменить теги ссылок.

Т.е. есть теги:
http://www.server.org
server
server

Нужно чтобы в результате урл был такой: http://мойсайт.ру/go?собственно урл из тега.

Вот сам фильтр, отвечающий за коды ссылок:

<?php
/* vim: set expandtab tabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------+
// | PHP Version 4 |
// +----------------------------------------------------------------------+
// | 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: Links.php,v 1.12 2007/07/02 18:26:17 cweiske Exp $
//

/**
* @package HTML_BBCodeParser
* @author Stijn de Reede <sjr@gmx.co.uk>
*/
require_once W_DIR . 'includes/libs/BBCodeParser/Filter.php';

/**
*
*/
class HTML_BBCodeParser_Filter_Links extends HTML_BBCodeParser_Filter
{
/**
* List of allowed schemes
*
* @access private
* @var array
*/
var $_allowedSchemes = array('http', 'https', 'ftp');

/**
* 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')
)
);


/**
* 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 = PEAR::getStaticProperty('HTML_BBCodeParser', '_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.]+\.{2,4}[^\s()\[\]]*)/i",
"!".$oe."url(".$ce."|\s.*".$ce.")(.*)".$oe."/url".$ce."!iU",
"!".$oe."url=(((*:(//)?)|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);

}


function smarterPPLinkExpand($matches)
{
//echo '<hr><pre>';var_dump($matches);echo '</pre><hr>';
$options = PEAR::getStaticProperty('HTML_BBCodeParser','_options');
$o = $options['open'];
$c = $options['close'];

//If we have an intro tag that is , then skip this match
if ($matches[1] == $o.'url'.$c) {
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 = PEAR::getStaticProperty('HTML_BBCodeParser','_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=http://' . DOMAIN_NAME . '/go_url?'.$urlServ.$path.$c.$matches[6].$o.'/url'.$c; //Здесь я добавил: http://' . DOMAIN_NAME . '/go_url?
}

//Else remove url tag
return $matches[6];
}
}
?>


В общем теперь первые два варианта: http://www.server.org и server работают правильно, как мне надо. А вот как совладать с этой конструкцией: server не пойму... Что тока не пробовал. Ссылка не меняется, и, кстати, я так понимаю, она должна создавать ссылку с параметром: target="...", но она этого не делает, а создаёт обычную ссылку... Но это уже какая то ошибка самого скрипта, это мне не интересно... Мне нужно изменить урл... Кто чем может помочь?


Сам дистрибутив здесь: http://download.pear.php.net/package/HTML_BBCodeParser-1.2.2.tgz
dimagolov:
Smilies_, http://www.server.org t=new это не URL вообще, у Вас пробел между доменом и параметром.
Smilies_:
Smilies_, http://www.server.org t=new это не URL вообще, у Вас пробел между доменом и параметром.

Этот тег взят из официального примера к библиотеке. Этот код, по идее, должен создавать ссылку открывающуюся в новом окне. Но вопрос не в этом. Мне нужно изменить сам адрес.
Smilies_:
А всё-таки, может кто-то из специалистов обратит на скромного меня внимание и предложит вариант решения проблемы?

Эта тема на forum.dklab.ru