Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Регулярные выражения BBCode [URL], Поиск и замена всех вхож. BBCode to HTML 
V
    Опции темы
Vreden
Дата 22.6.2011, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Idiotic Admin
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 12.7.2006

Репутация: нет
Всего: 1



С обычными [ B ][ /B ] (пробелы для предотвращения обработки тегов форумом) и тому подобными тегами никаких проблем, конечно, не возникло. Но не могу обработать тег  [ URL=http://google.ru ]Google[ /URL ]
Есть строка, с неизвестным количеством вхождений URL, то есть [ URL=* ]*[ /URL ] 
В конечном результате необходимо получить <a href="*" target="_blank">*</a> при каждом совпадении.

Для начала, я пытался хотябы просто задать паттерн для [ URL=* ]*[ /URL ], но даже этого у меня не получилось.
Код

$string = ereg("\[URL=*\]*\[/URL\]",$string, $regs);


Подскажите как и в какой последовательности реализовать задачу.


--------------------
Чё? Как? ©
PM MAIL WWW   Вверх
bars80080
Дата 22.6.2011, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



ну ссылку, допустим я выбиваю так:

Код

        $ar = array(
            '#\[link=(.+)\](.+)\[\/link\]#isu', '#\[link\](.+)\[\/link\]#isu',
        );    
        $ag = array(
            '<a href="\\1">\\2</a>', '<a href="\\1">\\1</a>',
        );
        $text = preg_replace($ar, $ag, $text);


но для сложных поисков лучше использовать функцию:

Код

        $ar = array('#\[quote([^\]]*?)\](.+)\[\/quote\]#isu');
        $func = 'handler';
        $text = preg_replace_callback($ar, $func, $text);

где 
Код

function handler($m) {
    // а здесь уже что угодно можно делать с полученными данными
    return 'нужный результат';
}

PM MAIL WWW   Вверх
Vreden
Дата 22.6.2011, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Idiotic Admin
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 12.7.2006

Репутация: нет
Всего: 1



Цитата(bars80080 @ 22.6.2011,  13:39)
Код

        $ar = array(
            '#\[link=(.+)\](.+)\[\/link\]#isu', '#\[link\](.+)\[\/link\]#isu',
        );    
        $ag = array(
            '<a href="\\1">\\2</a>', '<a href="\\1">\\1</a>',
        );
        $text = preg_replace($ar, $ag, $text);

Интересный пример, но до конца не могу понять как это работает и нагуглить мануал по такой конструкции тоже неудалось.
Подскажите, я так понимаю "\\1" это ссылка на первую конструкцию (.+) и соответственно \\2 на второю (.+)? Интересная особенность регулярных выражений, о которой я не имел представления.

Как заставить это выражение замещать все вхождения в $text и работать с русскими символами. При наличии двух и более вхождений тегов [ URL ], все что находится после [/URL] пропадает, то есть часть строки после первого замещения исчезает. Это также при условии, что все символы латинские. При наличии русских символов preg_replace возвращает пустую строку.


--------------------
Чё? Как? ©
PM MAIL WWW   Вверх
Vreden
Дата 22.6.2011, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Idiotic Admin
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 12.7.2006

Репутация: нет
Всего: 1



Обе проблемы решены, модификатор "u" заменен на модификатор "U"


--------------------
Чё? Как? ©
PM MAIL WWW   Вверх
bars80080
Дата 22.6.2011, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



модификатор "u" - для работы с utf-кодировками, если вы используете текст в cp1251, то его просто надо убрать
модификатор "U" - разрешение на жадность, если его поставить, то сколько бы ссылок не было в обрабатываемом тексте, вы получите всего одну большую ссылку, начинающуюся с первого [URL] и заканчивающегося последним [/URL]
PM MAIL WWW   Вверх
Vreden
Дата 22.6.2011, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Idiotic Admin
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 12.7.2006

Репутация: нет
Всего: 1



Цитата(bars80080 @ 22.6.2011,  17:45)
модификатор "U" - разрешение на жадность, если его поставить, то сколько бы ссылок не было в обрабатываемом тексте, вы получите всего одну большую ссылку, начинающуюся с первого [URL] и заканчивающегося последним [/URL]

Смею предположить, что модификатор "U" делает выражение, наоборот, не жадным.
http://on-line-teaching.com/php/regexp.htm
http://www.shtogrin.com/library/web/pcre/doc/modificators/

У меня же без этого модификатора, как раз-таки при нескольких вхождениях тегов, остается один. С модификатором отрабатывает нормально.


--------------------
Чё? Как? ©
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1056 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.