Проблема с регулярными выражениями и preg_replace

engh
На сайте с 24.07.2007
Offline
78
496

Здравствуйте, уважаемые форумчане! Помогите решить следующую проблему.

Есть исходный текст в файле:

 <Nomen Name="Анкерная техника" Code="3621" IsGroupe="1" Pic="">

<Nomen Name="Анкер Sоrmat (MSA, PFG ES)" Code="7677" IsGroupe="1" Pic="">
<Nomen Name="Анкер MSA латунный Sоrmat" Code="9121" IsGroupe="1" Pic="00009121.jpg">
<Nomen Name="Анкер латунный МSA-10 (50шт)" Code="7680" IsGroupe="0">
<Cost Type="Мелкий опт" Price="772.23" />
<Cost Type="Средний опт" Price="689.49" />
</Nomen>
<Nomen Name="Анкер латунный МSA-12 (50шт)" Code="7679" IsGroupe="0">
<Cost Type="Мелкий опт" Price="1441.08" />
<Cost Type="Средний опт" Price="1286.68" />
</Nomen>
<Nomen Name="Анкер латунный МSA-5 (200шт)" Code="7678" IsGroupe="0">
<Cost Type="Мелкий опт" Price="889.82" />
<Cost Type="Средний опт" Price="794.48" />
</Nomen>
<Nomen Name="Анкер латунный МSA-6 (100шт)" Code="7681" IsGroupe="0">
<Cost Type="Мелкий опт" Price="555.76" />
<Cost Type="Средний опт" Price="496.22" />
</Nomen>
<Nomen Name="Анкер латунный МSA-8 (100шт)" Code="7682" IsGroupe="0">
<Cost Type="Мелкий опт" Price="1009.66" />
<Cost Type="Средний опт" Price="901.48" />
</Nomen>
</Nomen>
<Nomen Name="Анкер PFG ES универсальный Sоrmat" Code="9114" IsGroupe="1" Pic="00009114.jpg">
<Nomen Name="Анкер PFG ES 10 универсальный (50шт.)" Code="9115" IsGroupe="0">
<Cost Type="Мелкий опт" Price="1469.71" />
<Cost Type="Средний опт" Price="1312.24" />
</Nomen>
<Nomen Name="Анкер PFG ES 16 универсальный (10шт.)" Code="9116" IsGroupe="0">
<Cost Type="Мелкий опт" Price="1254.92" />
<Cost Type="Средний опт" Price="1120.47" />
</Nomen>
</Nomen>
</Nomen>

Необходимо перегнать данную информацию в базу данных. Пробовал парсеры XML, ничего хорошего не вышло. Парсеры в массив генерируют очень сложную конструкцию с которой непросто разобраться. Может посоветуете парсер XML, который бы представил информацию в понятном виде? С учетом вложенности.

Вариант №2: пробую распарсить данный код с помощью preg_replace:

$r=fopen("price.xml", "r");

$text=fread($r, filesize("price.xml"));
fclose($r);

$text=str_replace('<?xml version="1.0" encoding="windows-1251"?>', '', $text);
$text=str_replace('/>', '>', $text);

print preg_replace("/<Nomen Name=\"(.*?)\" Code=\"([0-9]*)\" IsGroupe=\"([0-9])\" Pic=\"(.*?)\">/", "1: $1~$2~$3~$4<br>", $text);

Получается примерно вот что:

1: Склад 1~3620~1~

1: Анкерная техника~3621~1~
1: Анкер Sоrmat (MSA, PFG ES)~7677~1~
1: Анкер MSA латунный Sоrmat~9121~1~00009121.jpg
1: Анкер латунный МSA-10 (50шт)" Code="7680" IsGroupe="0"> 1: Склад 1~3620~1~

Т.е. когда вхождения по моему шаблону заканчиваются вся строка до следующего вхождения попадает под шаблон..

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

Необходимо чтобы получилось в итоге примерно так:

1: Название верхнего раздела~атрибуты~атрибуты (назавние, код)

2: Название вложенного раздела~атрибуты~атрибуты (название, код)
3: Название продукта~атрибуты~атрибуты (название, код, цена №1, цена №2)
3: Название продукта~атрибуты~атрибуты (название, код, цена №1, цена №2)

Буду признателен за Вашу помощь!

enough 4 U..
J
На сайте с 02.02.2009
Offline
53
#1

print preg_replace("/<Nomen Name=\"([^"]*?)\" Code=\"([0-9]*)\" IsGroupe=\"([0-9])\" Pic=\"([^"]*?)\">/", "1: $1~$2~$3~$4<br>", $text);

попробуйте так

jumash добавил 05.08.2009 в 17:29

или

print preg_replace("/<Nomen Name=\"(.*?)\" Code=\"([0-9]*)\" IsGroupe=\"([0-9])\" Pic=\"(.*?)\">/U", "1: $1~$2~$3~$4<br>", $text);

[Удален]
#2

почему бы не использовать для работы с хмл средства для работы с хмл?

php.net/simplexml_load_string

T.R.O.N
На сайте с 18.05.2004
Offline
314
#3

engh, почем не решить проблему самым простым способом. Возьмите это, сохраните в XML файл и откройте его в Excel. Все открывается очень красиво. Потом длелайте с ним что хотите.

От воздержания пока никто не умер. Хотя никто и не родился! Prototype.js был написан теми, кто не знает JavaScript, для тех, кто не знает JavaScript (Richard Cornford)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий