|
|
|
| Нужно изменить теги ссылок.
Поставлю в BB-кодах нижние подчёркивания "_", чтоб их ваш форум не приобразовывал. В реале этих знаков нет.
Т.е. есть теги:
[_url_]http://www.server.org[_/url_]
[_url_=http://www.server.org]server[_/url_]
[_url_=http://www.server.org t=new]server[/url_]
Нужно чтобы в результате урл был такой: 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.]+\.[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);
}
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 [url], 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];
}
}
?>
|
В общем теперь первые два варианта: [_url_]http://www.server.org[_/url_] и [_url_=http://www.server.org]server[_/url_] работают правильно, как мне надо. А вот как совладать с этой конструкцией: [_url_=http://www.server.org t=new]server[_/url_] не пойму... Что тока не пробовал. Ссылка не меняется, и, кстати, я так понимаю, она должна создавать ссылку с параметром: target="...", но она этого не делает, а создаёт обычную ссылку... Но это уже какая то ошибка самого скрипта, это мне не интересно... Мне нужно изменить урл... Кто чем может помочь? | |
|
|
|
|
|
|
|
для: Александрович
(21.09.2007 в 01:08)
| | Сам дистрибутив здесь: http://download.pear.php.net/package/HTML_BBCodeParser-1.2.2.tgz | |
|
|
|
|
|
|
|
для: Александрович
(21.09.2007 в 01:13)
| | Спасибо, может ещё кто-нибудь подскажет? :) | |
|
|
|
|
|
|
|
для: Александрович
(21.09.2007 в 01:08)
| | Может http://www.server.org?t=new, ведь http://www.server.org t=new - это не правильно.
Я пользуюсь таким (это часть, для bb-url ):
<?
function parse($msg) {
$searcharray[]="/\[url=(['\"]?)(www\.)([^\"']*)\\1](.*)\[\/url\]/siU";
$replacearray[]="<a href=\"http://www.\\3\" target=\"_blank\">\\4</a>";
$searcharray[]="/\[url=(['\"]?)([^\"']*)\\1](.*)\[\/url\]/siU";
$replacearray[]="<a href=\"\\2\" target=\"_blank\">\\3</a>";
$searcharray[]="/\[url](www\.)([^\"]*)\[\/url\]/siU";
$replacearray[]="<a href=\"http://www.\\2\" target=\"_blank\">\\2\\3</a>";
$searcharray[]="/\[url]([^\"]*)\[\/url\]/siU";
$replacearray[]="<a href=\"\\1\" target=\"_blank\">\\1</a>";
return preg_replace($searcharray, $replacearray, $msg);
}
$msg = '[.url=http://www.server.org?t=new.]Main Site[./url.]'; //точки для обману
echo parse($msg);
?>
|
| |
|
|
|
|
|
|
|
для: sim5
(22.09.2007 в 11:31)
| | Это немного не то... Я использую тот класс, на который ссылку дал. То, что я выложил - это часть отвечающая за ссылки. Мне просто надо, чтобы получившиеся после парса урлы, добавлялись к моему урлу... | |
|
|
|
|
|
|
|
для: Александрович
(23.09.2007 в 00:06)
| | Ну это делает тоже самое, а в вашем примере в написании URL ошибка, может поэтому так, в ином случае регулярку надо модифицировать. | |
|
|
|
|
|
|
|
для: sim5
(23.09.2007 в 04:42)
| | Ну да) Я так и понял, что надо... Только вопрос - КАК?Я сам пробовал, нудно и долго. Ничего из этого не вышло хорошего... | |
|
|
|
|
|
|
|
для: Александрович
(24.09.2007 в 00:24)
| | Так я вам их 4 штуки представил, для разного способа написания bb-кода, заберите их. Не хотите долго париться обращайтесь просто к функции для парса URL, фукцию то совсем легко в код вставить. :) | |
|
|
|
|
|
|
|
для: sim5
(24.09.2007 в 05:05)
| | Да фишка в том, что тот скрипт проверяет "перекрещённость" тегов. Если я добавлю свои регулярки, то вся эта проверка будет работать не правильно. Я уже пробовал. Надо именно починить то, что есть :) | |
|
|
|
|
|
|
|
для: Александрови4
(25.09.2007 в 00:21)
| | Ну тогда вам к слесарям. :) | |
|
|
|
|
|
|
|
для: sim5
(25.09.2007 в 08:32)
| | >Ну тогда вам к слесарям. :)
Слесаря не помогут :) Здесь нужны специалисты в другой области) | |
|
|
|