2

我正在尝试用带引号的字符串替换任何换行符,例如

$help = '"Hi this is a string and I really want to replace
any newlines that are within that string" "There are multiple strings all within one string that all need
to have their newlines replaces"';

我已经尝试了各种。问题是我自己无法摆脱行尾。否则 fgetcsv 函数返回一个数组。它需要是引号内的行尾/换行符。

$str = str_replace(PHP_EOL, '', $str);

好的,这是我的代码。下载 csv 文件。

<?php
    $username = 'username';
    $password = 'password';
    $loginURL = 'http://www.example.com/login';
    $contentURL = 'http://www.example.com/feedback.csv';

    // Initialize the curl
    $ch = curl_init();

    // Pass the curl some options
    curl_setopt($ch, CURLOPT_URL, $loginURL);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, 'inp-email=' . $username . '&inp-pass=' . $password);
    curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    // Execute the curl to login
    $store = curl_exec($ch);

    // Change the URL to the CSV and execute
    curl_setopt($ch, CURLOPT_URL, $contentURL);
    $content = curl_exec($ch);

    // Time to sanitise, first I want to remove any newlines from customers comments
    $content = '\"' .implode('"', explode(PHP_EOL, $content)) . '\"';

    // Return the file contents
    file_put_contents('feedback.csv', $content)

然后是抓取 CSV 文件并将其打印出来的文件......

<?php
    // Function to loop through CSV and build up array
    function readCSV($csvFile){
        $file_handle = fopen($csvFile, 'r');
        while (!feof($file_handle) ) {
            $csvlines[] = fgetcsv($file_handle, 0, "\t");
        }
        fclose($file_handle);
        return $csvlines;
    }

    // Set path to CSV file
    $csvFile = 'feedback.csv';

    // Read the CSV file and build array using readCSV function
    $csv = readCSV($csvFile);

    echo '<pre>';

    foreach($csv as $line){
        if(count($line) != 16){
            print_r($line);
        }
    }

    echo '</pre>';

因此,重申一下,我正试图从这一点出发:

$str = '"this string has no new lines"  "but this one does have new
lines to strip out"';

到:

$str = '"this string has no new lines"  "but this one does have new lines to strip out"';
4

2 回答 2

3

这是解决原始问题(demo)中给出的问题的一种可能方法:可以通过...删除双引号字符串中的所有换行符(但只有那些!)

preg_replace('#\\n(?=[^"]*"[^"]*(?:"[^"]*"[^"]*)*$)#' , ' ', $help);

核心思想很简单:对于每个行尾符号,我们确保它后面跟着 ( DQM= ")...

  • 任意数量的非 DQM 符号,然后...
  • 正好一个 DQM,那么...
  • 任意数量的非 DQM,然后...
  • 任意数量的single DQM - any number of non-DQM - single DQM - any number of non-DQM连击,然后...
  • 字符串的结尾。

对于格式正确的字符串,这将导致收集位于双引号之间的端线,如要求的那样。

不过,这种方法有一个警告。显然,如果它具有奇数个 DQM,我们将无法更正该行(甚至更多,在这种情况下它将无法正常工作)。这很容易检查,只需计算字符串中的 DQM。顺便说一句,对于此类字符串,所需的行为有点不清楚:

"should "we 
replace" endline here
?

从理论上讲,它仍然可以通过使用look-behind而不是look-ahead来修复,就像这样......

preg_replace('#(?<=^(?:[^"]*"[^"]*")*[^"]*"[^"]*)\\n#' , ' ', $help);

...但在实践中,不能(仍然)在 PHP 中使用可变长度的后视表达式。所以在这种情况下你必须求助于解析这个字符串。

但是,如果这种考虑与您的情况无关,那么我想显示的方法可能会有所帮助。

于 2013-05-30T23:21:44.957 回答
2

试试这个:

$str = implode('', explode(PHP_EOL, $str));

如果它不起作用,请尝试对 PHP_EOL 常量进行硬编码:

$str = implode('', explode("\r\n", $str));

如果仍然无法正常工作,请尝试在此处处理您的 CSV 文件:

foreach($csv as $line){
    if(count($line) != 16){
        print_r(implode('', explode("\n", $line)));
    }
}
于 2013-05-30T22:21:37.233 回答