Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Немного изменить HTML_BBCodeParser из PEAR
 
 автор: Александрович   (21.09.2007 в 01:08)   письмо автору
 
 

Нужно изменить теги ссылок.
Поставлю в 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($urlServ0$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:13)   письмо автору
 
   для: Александрович   (21.09.2007 в 01:08)
 

Сам дистрибутив здесь: http://download.pear.php.net/package/HTML_BBCodeParser-1.2.2.tgz

   
 
 автор: Александрович   (22.09.2007 в 00:26)   письмо автору
 
   для: Александрович   (21.09.2007 в 01:13)
 

Спасибо, может ещё кто-нибудь подскажет? :)

   
 
 автор: sim5   (22.09.2007 в 11:31)   письмо автору
 
   для: Александрович   (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);
?>

   
 
 автор: Александрович   (23.09.2007 в 00:06)   письмо автору
 
   для: sim5   (22.09.2007 в 11:31)
 

Это немного не то... Я использую тот класс, на который ссылку дал. То, что я выложил - это часть отвечающая за ссылки. Мне просто надо, чтобы получившиеся после парса урлы, добавлялись к моему урлу...

   
 
 автор: sim5   (23.09.2007 в 04:42)   письмо автору
 
   для: Александрович   (23.09.2007 в 00:06)
 

Ну это делает тоже самое, а в вашем примере в написании URL ошибка, может поэтому так, в ином случае регулярку надо модифицировать.

   
 
 автор: Александрович   (24.09.2007 в 00:24)   письмо автору
 
   для: sim5   (23.09.2007 в 04:42)
 

Ну да) Я так и понял, что надо... Только вопрос - КАК?Я сам пробовал, нудно и долго. Ничего из этого не вышло хорошего...

   
 
 автор: sim5   (24.09.2007 в 05:05)   письмо автору
 
   для: Александрович   (24.09.2007 в 00:24)
 

Так я вам их 4 штуки представил, для разного способа написания bb-кода, заберите их. Не хотите долго париться обращайтесь просто к функции для парса URL, фукцию то совсем легко в код вставить. :)

   
 
 автор: Александрови4   (25.09.2007 в 00:21)   письмо автору
 
   для: sim5   (24.09.2007 в 05:05)
 

Да фишка в том, что тот скрипт проверяет "перекрещённость" тегов. Если я добавлю свои регулярки, то вся эта проверка будет работать не правильно. Я уже пробовал. Надо именно починить то, что есть :)

   
 
 автор: sim5   (25.09.2007 в 08:32)   письмо автору
 
   для: Александрови4   (25.09.2007 в 00:21)
 

Ну тогда вам к слесарям. :)

   
 
 автор: Александрови4   (26.09.2007 в 01:15)   письмо автору
 
   для: sim5   (25.09.2007 в 08:32)
 

>Ну тогда вам к слесарям. :)

Слесаря не помогут :) Здесь нужны специалисты в другой области)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования