PHP найти слова, завернутые в строки и unwordwrap - PullRequest
0 голосов
/ 06 декабря 2011

У меня есть этот вывод (из другой системы), который мне нужен, чтобы поле Test было в одной строке. Эта глупая система переносит слова по 45 символов (примерно 30 пробелов перед каждой строкой)

Вот мой пример вывода (который мне нужно ввести)

                      Name:
                      Pepsi
                      Test:
                      The Result was blah
                      and blah
                      Tester:
                      John

                      Name:
                      Sprite
                      Test:
                      The result was negative
                      Tester:
                      Jane

                      Etc etc

Иногда строка после Test: переносится словом (иногда нет)
Мне нужно, чтобы эта строка была развернута без слов, чтобы я мог импортировать ее в доступе.

Файл составляет около 2 МБ, и есть много экземпляров, которые необходимо очистить. Вот почему я пытаюсь написать этот сценарий.

Спасибо

---------------- EDIT -------------

Это то, что я придумал до сих пор. Но я не могу заставить его заменить

<?php
function replace_newline($string) {
    return (string)str_replace(array("\r", "\r\n", "\n", "     ", "    ", "   ", "  "), ' ', $string);
}

function GetBetween($content,$start,$end){

    $r = explode($start, $content);

    foreach($r as $value){


        $t = explode($end, $value); //$t[0] between value

        $result = trim(preg_replace('/[\t\r\n]+/', ' ', trim($t[0])));

        $result = trim($result);
        $result = replace_newline($result);
        if ( !strstr($result, "Name:") ) {
            echo $result . "\r\n";
            $test = str_replace($t[0], $result, $test);
        }
    }


}
$test= file_get_contents("4321.txt");

GetBetween($test, "Test:", "Tester:");

?>

Это выводит:
Результат был бла и бла
Результат был отрицательным

1 Ответ

0 голосов
/ 06 декабря 2011

Возможно, это не рабочий код, но вы поняли:

$cur = "";

foreach ($line as $l)
{
    if (strpos($l, ':') !== FALSE)
    {
        // Keep track of a new chunk
        if ( !empty(trim($cur)) ) { /* Write old data if not empty */ }

        // Start new chunk
        $cur = trim($l);
    }

    // Not a new chunk, add to end of last one
    $cur .= ' '. trim($l);
}

// Write the last chunk here

// Close file

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


Я знаю, я сказал, что не буду использовать регулярные выражения, но здесь идет речь:

function getChunks($data)
{
    // Clean up whitespace
    $data = preg_replace('/\s+/', ' ', $data);

    // Create an anchor point before the label word
    $data = preg_replace('/\w+:/', '##\0', $data);

    // Separate the data into chunks based on anchors
    $sets = explode('##', $data);

    // Keep any and all chunks that aren't empty
    $sets = array_filter($sets, function($d) { return !empty(trim($d)); } );

    // array_filter() can damage the indexing, so return just the values
    return array_values($sets);
}

Я не проверял код, но комментарии должны быть немного подсказкой.
Обратите внимание, что это работает, только если 1) только метки содержат точку с запятой и 2) метки имеют длину только одно слово. Кроме того, вы не захотите запускать это на массивном наборе данных. Это не оптимизировано для такого рода вещей. Он оптимизирован для быстрого и грязного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...