[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: парсинг базы
respublika
Всем хорошего дня!
Имеется большой (1Мв) файл приблизительно такой структуры (фрагмент):

<site>
<site-metadata
site-key="2093">
<name
full="Signal Iduna Park"/>
<home-location
city="Dortmund"
postal-code="44139"
street="Strobelallee 50"/>
</site-metadata>
</site>



Мне нужно повырезать блоки site-metadata из которых я потом повытаскиваю всё что нужно построчно.
Выражение '{<site-metadata(.*?)</site-metadata>}si' ищет построчно.
Как сделать, чтоб вырезало по всему файлу?
bestxp
вроде как xml документ у меня, так почему же через SimpleXML не пройтись или что-то подобное ?
killer8080
Цитата (respublika @ 2.03.2013 - 16:42)
Выражение '{<site-metadata(.*?)</site-metadata>}si' ищет построчно.

Добавь флаг U
respublika
Цитата (killer8080 @ 2.03.2013 - 15:01)
Цитата (respublika @ 2.03.2013 - 16:42)
'{<site-metadata(.*?)</site-metadata>}siU'


так вырезает только site-key="2093">
А мне нужно всё содержимое блока
respublika
Цитата (bestxp @ 2.03.2013 - 14:46)
вроде как xml документ у меня, так почему же через SimpleXML не пройтись или что-то подобное ?

я пользовал simplehtmldom
Похоже, что эта приблуда поцавитые тэги типа <tournament-division> не видит.
Или я не соображаю, но с парсингом обычных страниц у меня проблем не было.
killer8080
Цитата (respublika @ 2.03.2013 - 17:14)
так вырезает только site-key="2093">
А мне нужно всё содержимое блока

неужели
$t = <<<UUU 

<site>
<site-metadata site-key="2093">
<name full="Signal Iduna Park"/>
<home-location city="Dortmund"
postal-code="44139"
street="Strobelallee 50"/>
</site-metadata>
</site>

UUU;
preg_match('{<site-metadata(.*?)</site-metadata>}siU', $t, $m);
echo '<pre>'.htmlspecialchars(print_r($m, 1)).'</pre>';

respublika
killer8080,
спасибо, разобрался.
Invis1ble
respublika
насколько я помню (мельком видел когда-то потроха simple_html_dom), то да, он парсит только html-теги

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

respublika
Не, поторопился.
Не получается не фига. Повыхватывать из файла куски от <site> до </site> не работает.
killer8080
respublika
а чем не устраивает simplexml?
$t = <<<UUU

<site>
<site-metadata site-key="2093">
<name full="Signal Iduna Park"/>
<home-location city="Dortmund"
postal-code="44139"
street="Strobelallee 50"/>
</site-metadata>
</site>

UUU;
$xml = simplexml_load_string($t);
echo '<pre>'.print_r($xml, 1).'</pre>';
OleKh
как ещё один вариант
$string   = file_get_contents( 'file.xml' );
$xml = new SimpleXMLElement($string);
$result = $xml->xpath('//site-metadata[@site-key]');
foreach ($result as $value){
echo '<pre>'.print_r($value, 1).'</pre>';
}
respublika
при использовании регулярного выражения выше, нужно применить флаг m.
Тогда всё получается user posted image
Ресурсоёмкость решения не чешет - работы проводяться на локальном сервере.
arlamar
А можно пример кода? Как раз разбираюсь с регулярками и интересно всё что касается модификаторов.

Не понимаю как модификатор m мог решить проблему, ведь с ним поиск производится по строке.

Почему, самый простой вариант:
if ( preg_match_all('/<site>(.*)<\/site>/isuU', $content, $matches) ) {
print '<pre><xmp>'.print_r($matches[1], 1).'</xmp></pre>';
}
respublika
Не знаю почему. Сам фраер. Просто стало выделяться то, что нужно.
Но я попробовал SimpleXML по совету старших товарищей и убедился, что это действительно проще. Всю работу выполнил SimpleXML. biggrin.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.