preg_replace引号内的所有换行符

时间:2013-05-30 22:16:08

标签: php regex preg-replace

抱歉,如果这看起来像一个简单的问题,但我试图替换任何带引号字符串的换行符,例如。

$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"';

2 个答案:

答案 0 :(得分: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)));
    }
}

答案 1 :(得分:2)

这是解决原始问题(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
?

理论上,通过使用后视而不是前瞻,它仍然可以修复一下,就像这样......

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

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

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