1. Приветствуем Вас на неофициальном форуме технической поддержки XenForo на русском языке. XenForo - новый и перспективный форумный движок от бывших создателей vBulletin.

1.1.x Post Content Find / Replace

Тема в разделе "Плагины для XenForo", создана пользователем Romchik®, 24 янв 2012.

Загрузка
  1. Romchik®

    Romchik® The Power of Dreams Команда форума

    Регистрация:
    26.09.10
    Сообщения:
    5.736
    Симпатии:
    5.263
    Версия XF:
    1.5.10
    Post Content Find / Replace

    Тема на оф. сайте:
    Код:
    http://xenforo.com/community/resources/post-content-find-replace.1549/
    Автор: Kier
    Описание: плагин позволяем проводить автозамену в сообщениях.

    Screen shot 2010-10-15 at 22.53.14.png

    This is a very simple add-on I put together in order to allow an administrator to do a regular expression find and replace in the content of all posts.

    It was written in order to find all instances of a custom BB code tag for embedding YouTube video in an imported posts, and convert them to XenForo's [media=youtube] tag automatically.

    The interface is simple - you have three text fields and a checkbox.

    The second field should contain a full and valid PCRE regular expression, including flags and terminators.

    The third field will be used to determine the replacement text.

    The checkbox is used to switch between testing and commit mode. Unchecked, the replacements will be displayed but not saved.

    Пример конвертирования из
    [video="http://www.youtube.com/watch?v=ZSW4LDAHIeU"]Video title here[/video]​
    в
    [media=youtube]ZSW4LDAHIeU[/media]:​

    Quick Find:
    [video​

    Regular Expression:
    #\[video=("|'|)http:.+youtube.+v=(\w+)\1\].+\[/video\]#siU​

    Replacement String:
    [media=youtube]\2[/media]​

    Установка:
    1. Залить папку PostReplace в папку library.
    2. Импортировать XML-файл плагина (addon_PostReplace.xml).
    Ограничения:
    1. The system will not check that your regular expression is valid, or that it matches. It will fall over if your expression does not compile, and it will simply not match anything if the logic is incorrect.
    2. There is no batch processing in this add-on, so if you are replacing something that occurs in a lot of posts, this could be very slow and might time-out.
    So, given those limitations, I may as well release it seeing as it's written now. It might serve as a useful tutorial in creating an add-on anyway.


    Примечание: 10.01.2011 - Обновлен и поправлен код.
     

    Вложения:

    • PostReplace.zip
      Размер файла:
      10,8 КБ
      Просмотров:
      111
    DimmmCom, SAS1024, omentos и 3 другим нравится это.
  2. limon4eg

    limon4eg Местный

    Регистрация:
    24.11.11
    Сообщения:
    29
    Симпатии:
    1
    Версия XF:
    1.1.0 Final
    Выдает ошибку
    Код:
    preg_match_all() [function.preg-match-all]: Unknown modifier '�'
     
        XenForo_Application::handlePhpError() in PostReplace/ControllerAdmin/PostReplace.php at line 26
        PostReplace_ControllerAdmin_PostReplace->actionReplace() in XenForo/FrontController.php at line 310
        XenForo_FrontController->dispatch() in XenForo/FrontController.php at line 132
        XenForo_FrontController->run() in /home/nnn/public_html/admin.php at line 13
    
     
  3. infis

    infis Местный Команда форума

    Регистрация:
    27.06.11
    Сообщения:
    5.448
    Симпатии:
    3.271
    Версия XF:
    1.5.9
    Какая-то проблема с кодировкой, видимо. А 26-ю строку или кусок кода можете показать?
     
    limon4eg нравится это.
  4. limon4eg

    limon4eg Местный

    Регистрация:
    24.11.11
    Сообщения:
    29
    Симпатии:
    1
    Версия XF:
    1.1.0 Final
    Вот, весь код:
    PHP:
    <?php
     
    class PostReplace_ControllerAdmin_PostReplace extends XenForo_ControllerAdmin_Abstract
    {
        public function 
    actionIndex()
        {
            return 
    $this->responseView('PostReplace_ViewAdmin_PostReplace_Index''postreplace_index');
        }
     
        public function 
    actionReplace()
        {
            
    $this->_assertPostOnly();
     
            
    $input $this->_input->filter(array(
                
    'find' => XenForo_Input::STRING,
                
    'regex' => XenForo_Input::STRING,
                
    'replace' => XenForo_Input::STRING,
                
    'commit' => XenForo_Input::UINT,
                
    'page' => XenForo_Input::UINT,
            ));
     
            
    $posts $this->_getPRPostModel()->getPostsContaining($input['find']);
     
            foreach (
    $posts AS $postId => &$post)
            {
                if (
    preg_match_all($input['regex'], $post['message'], $matches))
                {
                    
    $post['found'] = $matches[0];
                    
    $post['replaced'] = preg_replace($input['regex'], $input['replace'], $post['found']);
     
                    
    $message preg_replace($input['regex'], $input['replace'], $post['message']);
     
                    if (
    $input['commit'])
                    {
                        
    $dw XenForo_DataWriter::create('XenForo_DataWriter_DiscussionMessage_Post');
     
                        
    $dw->setOption(XenForo_DataWriter_DiscussionMessage::OPTION_IS_AUTOMATEDtrue);
                        
    $dw->setExistingData($posttrue);
     
                        
    $dw->set('message'$message);
     
                        
    $dw->save();
                    }
                }
                else
                {
                    unset(
    $posts[$postId]);
                }
            }
     
            
    $viewParams = array(
                
    'input' => $input,
                
    'posts' => $posts
            
    );
     
            return 
    $this->responseView('PostReplace_ViewAdmin_PostReplace_Replace''postreplace_index'$viewParams);
        }
     
        
    /**
        * @return PostReplace_Model_Post
        */
        
    protected function _getPRPostModel()
        {
            return 
    $this->getModelFromCache('PostReplace_Model_Post');
        }
    }
     
  5. infis

    infis Местный Команда форума

    Регистрация:
    27.06.11
    Сообщения:
    5.448
    Симпатии:
    3.271
    Версия XF:
    1.5.9
    Судя по коду, Вы что-то в поле с regex не то вводите. Т.е. сам код на первый взгляд ошибок не содержит и не может в принципе менять или использовать неверную кодировку. Также возможен вариант, когда в сообщениях содержатся какие-то некорректные символы.
     
    limon4eg нравится это.
  6. limon4eg

    limon4eg Местный

    Регистрация:
    24.11.11
    Сообщения:
    29
    Симпатии:
    1
    Версия XF:
    1.1.0 Final
    Хмм... С английскими символами работает отлично, а с русскими не хочет.
     
  7. Romchik®

    Romchik® The Power of Dreams Команда форума

    Регистрация:
    26.09.10
    Сообщения:
    5.736
    Симпатии:
    5.263
    Версия XF:
    1.5.10
    Скиньте лучше то, что вы вводите в поля плагина для замены.
     
    limon4eg нравится это.
  8. limon4eg

    limon4eg Местный

    Регистрация:
    24.11.11
    Сообщения:
    29
    Симпатии:
    1
    Версия XF:
    1.1.0 Final
    52351234.png
    ----------------------------------
    Это я ошибся:(, забыл дописать "/", в поле "Regular Expression:".:unsure:
     
  9. Andyk

    Andyk Местный

    Регистрация:
    27.01.12
    Сообщения:
    64
    Симпатии:
    6
    Версия XF:
    1.1.2
    Как поставить этот мод? Файлы ControllerAdmin, Model, Route, ViewAdmin нужно положить в папку library/xenforo ? Скопировал туда, скопировал в корень и скопировал в корень всю папку PostReplace. Импортировал xml, во вкладке Инструменты есть Replace in Posts, но при нажатии вижу - Ошибка. Запрашиваемая страница не найдена. Что делаю не так?
     
  10. infis

    infis Местный Команда форума

    Регистрация:
    27.06.11
    Сообщения:
    5.448
    Симпатии:
    3.271
    Версия XF:
    1.5.9
    Обычно любой плагин нужно копировать в library, а не в library/XenForo. Копируется папкой. В данном случае должно быть library/PostReplace/... и т.д.
     
  11. Andyk

    Andyk Местный

    Регистрация:
    27.01.12
    Сообщения:
    64
    Симпатии:
    6
    Версия XF:
    1.1.2
    Было бы отлично на месте автора хотя бы это положить в текстовый файл с плагином. Времени бы сэкономил... :)
     
  12. infis

    infis Местный Команда форума

    Регистрация:
    27.06.11
    Сообщения:
    5.448
    Симпатии:
    3.271
    Версия XF:
    1.5.9
    Вообще-то это стандартная процедура инсталляции плагина. Поэтому об этом обычно отдельно не пишут.
     
  13. Andyk

    Andyk Местный

    Регистрация:
    27.01.12
    Сообщения:
    64
    Симпатии:
    6
    Версия XF:
    1.1.2
    А если это ваш первый плагин? И после прочтения фака на главной
     
  14. infis

    infis Местный Команда форума

    Регистрация:
    27.06.11
    Сообщения:
    5.448
    Симпатии:
    3.271
    Версия XF:
    1.5.9
    Надо попросить Рому, чтобы добавил в фак :)
     
  15. Andyk

    Andyk Местный

    Регистрация:
    27.01.12
    Сообщения:
    64
    Симпатии:
    6
    Версия XF:
    1.1.2
    я как бы тонко намекал :)
     
  16. Romchik®

    Romchik® The Power of Dreams Команда форума

    Регистрация:
    26.09.10
    Сообщения:
    5.736
    Симпатии:
    5.263
    Версия XF:
    1.5.10
    В первое сообщение добавил шаги установки.
    Был уверен, что уже писал там об этом.
    Добавил примечание.
     
  17. b0g0m0l

    b0g0m0l Пользователь

    Регистрация:
    20.02.12
    Сообщения:
    6
    Симпатии:
    0
    а как с помощью этого модуля заменить [QUOTE name='Bosts' timestamp='1328520204' post='324'] Текст [/QUOTE] на [ QUOTE]Текст[/ QUOTE]
    name='Bosts' - имена разные, timestamp='1328520204' - цифры тоже разные и post='324' соответственно цифры тоже разные
     
  18. b0g0m0l

    b0g0m0l Пользователь

    Регистрация:
    20.02.12
    Сообщения:
    6
    Симпатии:
    0
    вообщем вот что у меня получается в Quick Find пишу ([QUOTE name =) в Регулярное выражение пишу (/[QUOTE name ='[A-Za-z0-9_]+' timestamp='[0-9_]+' post:'[0-9_]+'/), он все находит как надо, но вот не знаю как сделать замену в Replacement String: пишу вот что
    Код:
    [quote="\3, post: \8, member:"]
     
  19. infis

    infis Местный Команда форума

    Регистрация:
    27.06.11
    Сообщения:
    5.448
    Симпатии:
    3.271
    Версия XF:
    1.5.9
    Попробуйте искать так:
    Код:
    \[QUOTE name=\'.*\' timestamp=\'[0-9]+\' post=\'[0-9]+\'\](.+?)\[/QUOTE\]
    А заменять так:
    Код:
    [QUOTE]\1[/QUOTE]
    Суть вот в чем. В замену ставится то, что попалось в круглых скобках. Если пар скобок несколько, то и групп совпадений будет несколько. Поэтому из примера в первом посте вытаскивается в замену вторая группа, а не первая. А то, что внутри квадратных скобок - это просто поиск совпадений из перечисленных символов. Сами совпадения при этом не запоминаются и не участвуют в дальнейшем для замены.
    --- добавлено : Feb 22, 2012 6:18 AM ---
    Поправка. Поисковую строку лучше задать так:
    Код:
    \[QUOTE[^\]]*?\](.+?)\[/QUOTE[^\]]*?\]
    Иначе при наличии нескольких цитат в одном сообщении будет работать некорректно.
     
  20. b0g0m0l

    b0g0m0l Пользователь

    Регистрация:
    20.02.12
    Сообщения:
    6
    Симпатии:
    0
    Так ошибка у меня:
    Server Error

    preg_match_all() [function.preg-match-all]: Delimiter must not be alphanumeric or backslash
    XenForo_Application::handlePhpError()
    preg_match_all() in Z:\home\192.168.0.100\www\forum\library\PostReplace\ControllerAdmin\PostReplace.php at line 26
    PostReplace_ControllerAdmin_PostReplace->actionReplace() in Z:\home\192.168.0.100\www\forum\library\XenForo\FrontController.php at line 310
    XenForo_FrontController->dispatch() in Z:\home\192.168.0.100\www\forum\library\XenForo\FrontController.php at line 132
    XenForo_FrontController->run() in Z:\home\192.168.0.100\www\forum\admin.php at line 13
     

Поделиться этой страницей