powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / preg_replace_callback и (множественные подмаски)*
1 сообщений из 1, страница 1 из 1
preg_replace_callback и (множественные подмаски)*
    #38131836
Vasiliy_Kashkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Некоторый html-код содержит спецтеги вида [имя_тега атр1=знач1 атр2=знач2 ... атрN = значN].
Необходимо:
1). распарсить эти теги в массив вида
$tag[i]["name"]="имя_тега";
$tag[i]["attributes"]["атр1"]="знач1";
$tag[i]["attributes"]["атр2"]="знач2";
...
$tag[i]["attributes"]["атрN"]="значN";
где i - порядковый номер тега в тексте
2). выполнить замену этих тегов текстом, сформированным на основании имени тега и набора аргументов.
Пусть этот текст формируется некоторой функцией spec_tag($name,$attributes), где $name - имя i-го тега, $attributes - список его атрибутов.

Начинаю решать эту задачу при помощи preg_replace_callback:

preg_replace_callback("/\[\s*(\w+)((\s+(\w+)=(\w+))*|\s*)\s*\]/","callb",$text)

function callb($matches)
{
echo "<pre>";
print_r($matches);
echo "</pre>";
}

и обнаруживаю, что в функцию callb в качестве отдельных элементов массива $matches передаётся только последнее вхождение подмаски (\s+(\w+)=(\w+))* (элементы 4 и 5):

Array
(
[0] => [имя_тега атр1=знач1 атр2=знач2 атр3=знач3 атр4=знач4]
[1] => имя_тега
[2] => атр1=знач1 атр2=знач2 атр3=знач3 атр4=знач4
[3] => атр4=знач4
[4] => атр4
[5] => знач4
)

Можно ли (и тогда как) сделать, чтобы в виде отдельных элементов массива присутствовали все элементы множественной подмаски?
Например так:
Array
(
[0] => [имя_тега атр1=знач1 атр2=знач2 атр3=знач3 атр4=знач4]
[1] => имя_тега
[2] => атр1=знач1 атр2=знач2 атр3=знач3 атр4=знач4
[3] => атр4=знач4
[4] => атр1
[5] => знач1
[6] => атр2
[7] => знач2
[8] => атр3
[9] => знач3
[8] => атр4
[9] => знач4
)

Или так:
Array
(
[0] => [имя_тега атр1=знач1 атр2=знач2 атр3=знач3 атр4=знач4]
[1] => имя_тега
[2] => атр1=знач1 атр2=знач2 атр3=знач3 атр4=знач4
[3] => атр4=знач4
[4] => Array(
[0]=> атр1
[1] => знач1
[2] => атр2
[3] => знач2
[4] => атр3
[5] => знач3
[6] => атр4
[7] => знач4
)
)

Спасибо.
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / preg_replace_callback и (множественные подмаски)*
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]