PHP查找单词包装线和unwordwrap

时间:2011-12-06 15:37:43

标签: php replace

我有这个输出(来自另一个系统)我需要将测试字段放在一行上。 这个愚蠢的系统单词包含45个字符(每行前有30个空格)

这是我的示例输出(我需要输入)

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

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

                      Etc etc

有时候,测试之后的行会被包装(有些时候没有) 我需要将该行无文字包装,以便我可以在访问中导入它。

该文件大约是2mb,并且有很多实例需要清理。这就是我试图编写这个脚本的原因。

感谢

---------------- 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 :(得分:0)

这可能不是正常工作的代码,但你明白了这个想法:

$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)标签只有一个字长。此外,您不希望在海量数据集上运行此操作。它没有针对这类事情进行优化。它针对快速肮脏进行了优化。