LINUX.ORG.RU

Опять проблема с р-выражениями в php


0

1

есть такая структура:

serge
{
    type = man
    position = -0 -1.5
}
viktor
{
    type = man
    position = 2.888000768576476345264564645000 1.2
}
sasha
{
    type = woman
    position = 1.5 -2.6
}
masha
{
    type = woman
    position = 3.1 -1.5
}


Написал код для парсинга:
<?php
$file = file_get_contents('test.config');
preg_match_all('/(?:type = ([[:alnum:]]{0,}))|(?:position = ([[:print:]]{0,}[[:digit:]]{0,}))/', $file, $pos);
unset($pos[0]);
foreach ($pos as $positions) {
$count = count($positions);
for ($i=0; $i < $count; $i++) {
echo $positions[$i]."<br>";
}
}
?>


Он выводит так:
man

man

woman

woman


-0 -1.5

2.888000768576476345264564645000 1.2

1.5 -2.6

3.1 -1.5
А нужно так:
man
-0 -1.5

man
2.888000768576476345264564645000 1.2

woman
1.5 -2.6

woman
3.1 -1.5


Понятно что это из-за |, но я не знаю как по другому найти сначало type = man а следом position, в частности не знаю как найти перенос строки.



Последнее исправление: vladmenshikov (всего исправлений: 1)
Ответ на: комментарий от thesame

Думаю вы не поняли, мне нужно найти элемент type, и если он соответствует скажем type = man, то только тогда начать читать его position. Это нужно потому что в структуре файла не все так идеально как я показал в примере, а может быть и такое:

narkomani
{
    position: 2 5
serge
{
    type = man
    position = -0 -1.5
}
viktor
{
    type = man
    position = 2.888000768576476345264564645000 1.2
}
То есть, читая моим кодом, даже с применением thesame PREG_SET_ORDER, в выводе будет лишняя позиция общей группы «наркоманы», мне же нужно считать только позиции типа man, все остальное отбросить.

vladmenshikov
() автор топика
while ( preg_match('/\G.*?type = (\w+)\s+position = ([^\n]*)/s', $text, $match) )
        {
                $text = substr($text, strlen(array_shift($match)) );
                print_r($match);
        }
helios ★★★★★
()
Ответ на: комментарий от vladmenshikov

А нормальный формат выцепить нельзя? Или переписать модуль кторый выплёвывает этот текст чтоб там было что-нибудь более приятное для парсинга?

Иначе с регэкспами ты намучаешься, тут наверное грамматику проще составить и парсить по ней.

Kalashnikov ★★★
()
Ответ на: комментарий от commit

я немогу исправить эти файлы, точнее исправить то могу, но прога которая их создает с закрытым кодом, так что вариантов нет, нужно подстраиваться под их структуру.

vladmenshikov
() автор топика
Ответ на: комментарий от vladmenshikov

Причем тут прога с закрытым кодом? Доступ к файлам есть? Есть. Не вижу дальнейший препятствий.

commit ★★
()
Ответ на: комментарий от helios

Написал так как нужно, даже лучше чем требовалось, спасибо. Единственный оставшийся вопрос который мучает: почему мануал для перла а не пшп, хотя и работаетв в пшп но все же?

vladmenshikov
() автор топика
Ответ на: комментарий от vladmenshikov

Пожалуйста. Мануал для perl только потому, что preg_match - это именно perl regular expressions match.

helios ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.