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
Форумы портала PHP.SU :: Версия для печати :: Распарсить простой bbcode
Форумы портала PHP.SU » PHP » Регулярные выражения » Распарсить простой bbcode

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

1. Viper - 06 Февраля, 2014 - 15:32:01 - перейти к сообщению
Есть такой код
CODE (htmlphp):
скопировать код в буфер обмена
  1. [date start="2012-02-23" format="F j, Y"]

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

PS С учетом того что 'start' или 'format' могут быть не указаны вовсе.
2. OrmaJever - 06 Февраля, 2014 - 15:38:39 - перейти к сообщению
CODE (htmlphp):
скопировать код в буфер обмена
  1. '#\[date(\sstart="(.+?)")?(\sformat="(.+?)")\]#i'
3. Viper - 06 Февраля, 2014 - 15:52:49 - перейти к сообщению
OrmaJever спасибо. Чуть чуть подправил под свои нужды.

PHP:
скопировать код в буфер обмена
  1. '#\[date(\sstart="(?P<start_date>.+?)")?(\sformat="(?P<date_format>.+?)")\]#i'
4. OrmaJever - 06 Февраля, 2014 - 16:30:29 - перейти к сообщению
вконце забыл дописать ? к (\sformat="(.+?)")
5. Viper - 24 Февраля, 2014 - 02:13:03 - перейти к сообщению
Подниму тему чтобы не плодить новую

Есть такое
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]Венгрия


В чем затык-то?
6. VenZell - 24 Февраля, 2014 - 07:45:54 - перейти к сообщению
Посмотреть и протестировать можно тут.
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);
7. Viper - 24 Февраля, 2014 - 22:27:24 - перейти к сообщению
VenZell в общем одним паттерном без массива паттернов тут не обойтись. Я так понял.
8. Мелкий - 25 Февраля, 2014 - 08:33:47 - перейти к сообщению
Viper, сматчить-то - без проблем.
CODE (regex):
скопировать код в буфер обмена
  1. ~\[country\s+ln=(.+?)\]
  2. (?:\[cn=(.+?)\](.+?)\[/cn\]|[^\[]++)+
  3. \[/country\]~ix

А вот получить все результаты в разные подмаски - проблема...
Я бы взял preg_replace_callback
9. VenZell - 25 Февраля, 2014 - 09:04:57 - перейти к сообщению
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 Россия
10. Viper - 25 Февраля, 2014 - 11:22:41 - перейти к сообщению
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 замен.

Может проще переделать теги на статику, а заменять только языковую переменную?
11. MAXUS - 25 Февраля, 2014 - 15:35:53 - перейти к сообщению
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" Улыбка
ЗЗЫ Хотя вложенные тэги все равно так не распарсить...

 

Powered by ExBB FM 1.0 RC1