抱歉,如果这看起来像一个简单的问题,但我试图替换任何带引号字符串的换行符,例如。
$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"';
答案 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
= "
)...
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中使用可变长度的后视表达式。所以你必须在这种情况下解析这个字符串。
如果这种考虑与您的情况无关,那么我认为所示的方法可能会有所帮助。