Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Распарсить простой bbcode

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Viper
Отправлено: 06 Февраля, 2014 - 15:32:01
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




Есть такой код
CODE (htmlphp):
скопировать код в буфер обмена
  1. [date start="2012-02-23" format="F j, Y"]

Как его проще всего и быстрее распарсить?

PS С учетом того что 'start' или 'format' могут быть не указаны вовсе.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
OrmaJever
Отправлено: 06 Февраля, 2014 - 15:38:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




CODE (htmlphp):
скопировать код в буфер обмена
  1. '#\[date(\sstart="(.+?)")?(\sformat="(.+?)")\]#i'


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Viper
Отправлено: 06 Февраля, 2014 - 15:52:49
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




OrmaJever спасибо. Чуть чуть подправил под свои нужды.

PHP:
скопировать код в буфер обмена
  1. '#\[date(\sstart="(?P<start_date>.+?)")?(\sformat="(?P<date_format>.+?)")\]#i'


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
OrmaJever
Отправлено: 06 Февраля, 2014 - 16:30:29
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




вконце забыл дописать ? к (\sformat="(.+?)")


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Viper
Отправлено: 24 Февраля, 2014 - 02:13:03
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




Подниму тему чтобы не плодить новую

Есть такое
PHP:
скопировать код в буфер обмена
  1. $t = '[country ln=COUNTRIES][cn=us]США[/cn], [cn=hu]Венгрия[/cn][/country]';

и вот так
PHP:
скопировать код в буфер обмена
  1. echo preg_replace('#\[country ln=(.+?)\]\[cn=(.+?)\](.+?)\[/cn\]\[/country\]#i', '$1: $2 $3', $t);


получаю ф...
CODE (htmlphp):
скопировать код в буфер обмена
  1. COUNTRIES: us США[/cn], [cn=hu]Венгрия


В чем затык-то?


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
VenZell
Отправлено: 24 Февраля, 2014 - 07:45:54
Post Id


Частый гость


Покинул форум
Сообщений всего: 237
Дата рег-ции: Июнь 2013  


Помог: 12 раз(а)




Посмотреть и протестировать можно тут.
PHP:
скопировать код в буфер обмена
  1. $string = '[country ln=COUNTRIES][cn=us]USA[/cn], [cn=hu]Hungary[/cn], [cn=ru]Russia[/cn][/country]';
  2. $group_name_pattern = '#\[country ln=(.+?)\](.+?)\[\/country\]#i';
  3. $countries_pattern = '#\[cn=(.+?)\](.+?)\[\/cn\]#i';
  4. echo preg_replace(array($countries_pattern, $group_name_pattern), array('$1 $2', '$1: $2'), $string);
 
 Top
Viper
Отправлено: 24 Февраля, 2014 - 22:27:24
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




VenZell в общем одним паттерном без массива паттернов тут не обойтись. Я так понял.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
Мелкий Супермодератор
Отправлено: 25 Февраля, 2014 - 08:33:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Viper, сматчить-то - без проблем.
CODE (regex):
скопировать код в буфер обмена
  1. ~\[country\s+ln=(.+?)\]
  2. (?:\[cn=(.+?)\](.+?)\[/cn\]|[^\[]++)+
  3. \[/country\]~ix

А вот получить все результаты в разные подмаски - проблема...
Я бы взял preg_replace_callback


-----
PostgreSQL DBA
 
 Top
VenZell
Отправлено: 25 Февраля, 2014 - 09:04:57
Post Id


Частый гость


Покинул форум
Сообщений всего: 237
Дата рег-ции: Июнь 2013  


Помог: 12 раз(а)




Viper, можно и одним. Но без доработки результата напильником все равно не обойтись. Посмотреть можно тут
Вот код:

PHP:
скопировать код в буфер обмена
  1. $string = '[country ln=COUNTRIES][cn=us]США[/cn], [cn=hu]Венгрия[/cn], [cn=ru]Россия[/cn][/country]';
  2. $pattern = '#(?:\[country ln=(.+?)\]|,\s*)\[cn=([a-zA-Z]{2,3})\]([а-яА-ЯёЁ\s]+?)\[\/cn\](?=(?:,\s*|\[\/country\]))#u';
  3. $countries = preg_replace($pattern, '$1: $2 $3,', $string);
  4. $result = str_replace(array(',[/country]', ',:'), array('', ','), $countries);
  5. echo $result;
  6. # COUNTRIES: us США, hu Венгрия, ru Россия

(Отредактировано автором: 25 Февраля, 2014 - 09:05:59)

 
 Top
Viper
Отправлено: 25 Февраля, 2014 - 11:22:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




PHP:
скопировать код в буфер обмена
  1. $t = '[country ln=COUNTRIES][cn=us]США[/cn], [cn=hu]Венгрия[/cn], [cn=ru]Россия[/cn][/country]';
  2. echo '<pre>';
  3. echo preg_replace_callback('#\[country\s+ln=(.+?)\](.*?)\[/country\]#ix', function ($matches) {
  4.                 $html = '';
  5.                 $html .= $matches[1].': ';
  6.  
  7.                 $cn = preg_replace('#\[cn=(.+?)\](.+?)\[/cn\]#', '<img src="$1.png" border="0" alt="$2" class="ui-icon-country" />$2', $matches[2]);
  8.                 return $html.$cn;
  9.         }, $t);
  10. echo '<pre>';


Сделал пока вот так. Правда смущает быстродействие. В тексте таких замен 4. А текст этот на странице выводится в виде статей, т.е. от 5 до 100 статей. Итого примерно от 20 до 400 замен.

Может проще переделать теги на статику, а заменять только языковую переменную?


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
MAXUS
Отправлено: 25 Февраля, 2014 - 15:35:53
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011  


Помог: 7 раз(а)




Viper пишет:
Сделал пока вот так.


Вотета, думаю, подойдет:

PHP:
скопировать код в буфер обмена
  1. $string = '[country ln=COUNTRIES][cn=us]USA[/cn], [cn=hu]Hungary[/cn], [cn=ru]Russia[/cn], [cn=gb]Great Britain[/cn][/country]';
  2.  
  3. $pattern = '#\[country ln=(.*?)(\])|\[cn=|(\[\/cn\])|\[\/country\]|\]#ie';
  4. echo preg_replace($pattern, "'$1'.(('$2')?':':'').(('$3')?'':' ')", $string);


Насчет быстродействия буду признателен, если поделитесь результатами.

Дополнение: А... Ну если это парсинг, то не подойдет...

Важное дополнение:

Хотя, а почему нет?

PHP:
скопировать код в буфер обмена
  1.  
  2. $string = '[country ln=COUNTRIES][cn=us]USA[/cn], [cn=hu]Hungary[/cn], [cn=ru]Russia[/cn], [cn=gb]Great Britain[/cn][/country]';
  3.  
  4. $pattern = '#\[country ln=(.*?)\]|\[cn=(.*?)\](.*?)\[\/cn\]|\[\/country\]|,\s*#ie';
  5. echo preg_replace($pattern, "(('$1')?'$1:<br />':'').(('$2')?'<img src=\"$2.png\" border=\"0\" alt=\"$3\" class=\"ui-icon-country\" />$3':'')", $string);
  6.  


Работает эта хреновина!

Сдается, так че хочешь можно одним патерном распарсить. Модификатор "e" рулит...

ЗЫ Впервые вижу пользу от сочетания "ie" Улыбка
ЗЗЫ Хотя вложенные тэги все равно так не распарсить...

(Отредактировано автором: 25 Февраля, 2014 - 16:15:01)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB