Извлечь часть шаблона сопоставления строк - PullRequest
0 голосов
/ 19 октября 2011

Я хотел бы отсканировать большой фрагмент текста с помощью PHP и найти все совпадения для шаблона, а затем также 2 строки выше совпадения и 2 строки ниже.

Мой текст выглядит следующим образом, но с некоторым дополнительным ненужным текстом выше и ниже этого образца:

1

Текст описания

123.456.12

10,00

10,00

3

Другой текст описания

234.567.89

10,00

30,00

# Некоторый текст нижнего колонтитула, который не нужен и будет меняться для каждого текстового файла #

15

текст описания

564.238.02

4,00

60,00

15

текст описания

564.238.02

4,00

60,00

# Некоторый текст нижнего колонтитула, который не нужен и будет меняться для каждого текстового файла #

15

Больше текста описания

564.238.02

4,00

60,00

15

Подробнее текст описания

564.238.02

4,00

60,00

Используя PHP, я ищу соответствие каждому числу, выделенному жирным шрифтом (всегда одинаковый формат - 3 цифры, точка, 3 цифры, точка, 2 цифры) , но затем также возвращает предыдущие 2 строки и следующую 2 строки и, надеюсь, вернут массив, чтобы я мог использовать:

$contents[$i]["qty"] = "1";
$contents[$i]["description"] = "Description text";
$contents[$i]["price"] = "10.00";
$contents[$i]["total"] = "10.00";

и т.д ...

Возможно ли это и буду ли я использовать регулярные выражения? Буду признателен за любую помощь или совет!

Спасибо

ОТВЕТИТЬ vzwick

Это мой последний код, который я использовал:

$items_array = array();
$counter = 0;

if (preg_match_all('/(\d+)\n\n(\w.*)\n\n(\d{3}\.\d{3}\.\d{2})\n\n(\d.*)\n\n(\d.*)/', $text_file, $matches)) {

    $items_string = $matches[0];
    foreach ($items_string as $value){

        $item = explode("\n\n", $value);

        $items_array[$counter]["qty"] = $item[0];
        $items_array[$counter]["description"] = $item[1];
        $items_array[$counter]["number"] = $item[2];
        $items_array[$counter]["price"] = $item[3];
        $items_array[$counter]["total"] = $item[4];

        $counter++;

    }

}
else
{
    die("No matching patterns found");
}

print_r($items_array);

Ответы [ 3 ]

2 голосов
/ 19 октября 2011
$filename = "yourfile.txt";
$fp = @fopen($filename, "r");
if (!$fp) die('Could not open file ' . $filename);

$i = 0; // element counter
$n = 0; // inner element counter

$field_names = array('qty', 'description', 'some_number', 'price', 'total');
$result_arr = array();

while (($line = fgets($fp)) !== false) {
    $result_arr[$i][$field_names[$n]] = trim($line);
    $n++;
    if ($n % count($field_names) == 0) {
        $i++;
        $n = 0;
    }
}

fclose($fp);
print_r($result_arr);

Редактировать: Ну, тогда регулярное выражение.

$filename = "yourfile.txt";
$file_contents = @file_get_contents($filename);
if (!$file_contents) die("Could not open file " . $filename . " or empty file");
if (preg_match_all('/(\d+)\n\n(\w.*)\n\n(\d{3}\.\d{3}\.\d{2})\n\n(\d.*)\n\n(\d.*)/', $file_contents, $matches)) {
    print_r($matches[0]);
    // do your matching to field names from here ..
}
else
{
    die("No matching patterns found");
}
1 голос
/ 19 октября 2011
(.)+\n+(.)+\n+(\d{3}\.\d{3}\.\d{2})\n+(.)+\n+(.)+

Возможно, потребуется заменить \ n на \ r \ n.Убедитесь, что регулярное выражение находится в режиме, когда "."не соответствует символу новой строки.

Чтобы ссылаться на группы по именам, используйте именованную группу захвата:

(?P<name>regex)

пример именованных групп захвата.

0 голосов
/ 19 октября 2011

Вы можете загрузить файл в массив, и они используют array_slice, чтобы разделить каждые 5 блоков строк.

<?php

$file = file("myfile");
$finalArray = array();

for($i = 0; $i < sizeof($file); $i = $i+5)
{
    $finalArray[] = array_slice($file, $i, 5); 
}

print_r($finalArray);
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...