如何在 PHP 中去除特殊的引号字符?
Posted
技术标签:
【中文标题】如何在 PHP 中去除特殊的引号字符?【英文标题】:How can I strip special quote characters in PHP? 【发布时间】:2012-06-18 19:13:40 【问题描述】:我接到了这个有很多问题的项目。其中之一是最终用户正在上传一个 CSV 文件,该文件直接从 MS Access 导出到其 Web 服务器上的目录中。下一步是截断几个数据库表,然后将 CSV 中的所有记录插入到数据库中。
但是,MS Access 用于撇号的撇号字符存在问题。它不是单引号 ',也不是双引号 "。它是一个撇号。像这样:
"Rock/Classic 80’s-90’s"
现在,我在我的 php 中尝试了以下方法来删除它们:
$d = str_replace("’", "", $d);
$d = str_replace(array("'", "\'", "\’", "’"), "", $d);
但是,这似乎不起作用。事实上,当基于这些数据运行 SQL 查询时,它似乎总是以某种方式将 ' 转换为 ' 而不将它们剥离,然后导致 SQL 错误,因为它认为该字符串已提前终止。
这是我正在使用的代码块之一:
$band_insert = "INSERT INTO `schedule` (`Band`, `Date`, `Genre`, `Club`, `Location`, `Venue`, `Time`) VALUES ( '%s', '%s', '%s', '%s', '%s', '%s', '%s' )";
$result = $mysqli->query('TRUNCATE TABLE `schedule`');
if(!$result) die('Truncate error');
if( ($handle=fopen('./export/schedule.csv', 'r')) !== FALSE)
while( ($data=fgetcsv($handle, 1000, ',', '"', '\\')) !== FALSE )
foreach($data as $d)
$d = str_replace("’", "", $d);
# For debugging purposes only
echo "<p>$d</p>";
$sql = sprintf($band_insert, $data[0], $data[1], $data[2], $data[3], $data[4], $data[5], $data[6]);
#$sql = $mysqli->real_escape_string($sql);
$result = $mysqli->query($sql);
if( ! $result ) $log[] = lg("Unable to perform query ($mysqli->errno): $mysqli->error");
$log[] = lg("Successful upload (".date("Y-m-d").").");
fclose($handle);
问题变成了,为什么这不起作用?当我回显 $d 值时,它会打印 ?在一个广场。即使文件顶部有header('Content-type: text/html; charset=utf-8');
。
【问题讨论】:
你应该能够利用这个答案:***.com/questions/1262038/… 可能重复:***.com/questions/1318869/… 我已经尝试了这两种解决方案,但似乎都无法正常工作。 【参考方案1】:我认为你写的 echo "<p>$d</p>";
有问题。我认为应该是这样的
echo "<p>".$d."</p>";
【讨论】:
echo "<p>$d</p>";
可以正常工作,但您的版本不会,因为您缺少分号 ;
:)【参考方案2】:
我在使用 Access 和 Excel 时遇到了一些类似的障碍,并使用我在某处捡到的这个来擦洗 MS 字符(因此,所有这些都归功于它的原作者)。也许您可以按原样使用它,或者相应地进行调整:
// First, replace UTF-8 characters.
$text = str_replace(
array("\xe2\x80\x98", "\xe2\x80\x99", "\xe2\x80\x9c", "\xe2\x80\x9d", "\xe2\x80\x93", "\xe2\x80\x94", "\xe2\x80\xa6"),
array("'", "'", '"', '"', '-', '--', '...'),
$text);
// Next, either REPLACE their Windows-1252 equivalents.
$text = str_replace(
array(chr(145), chr(146), chr(147), chr(148), chr(150), chr(151), chr(133)),
array("'", "'", '"', '"', '-', '--', '...'),
$text);
// OR, STRIP their Windows-1252 equivalents.
$text = str_replace(
array(chr(145), chr(146), chr(147), chr(148), chr(150), chr(151), chr(133)),
array('', '', '', '', '', '', ''),
$text);
【讨论】:
这就像一个魅力。唯一的问题是它现在拒绝从部分数据中删除 '。 没有关注你....例如?只需将答案调整为删除这些字符而不是替换它们。是这个意思吗? 我也试过了,但由于某种原因,它仍在撇号所在的位置添加一个 ' 字符。运行不同的脚本时,表示这些行中的每一行都有一个无效的 UTF-8 字符。我采取了剥离除 UTF 和 Windows 替换之外的所有项目的路线。 出于某种原因,它实际上仍在放入这些符号的 MS 版本。 因此,发现问题在于 foreach 循环中的值传递。将foreach($data as $d)
更改为foreach($data as &$d)
,效果很好。谢谢!【参考方案3】:
我获取了您的代码并使用变量使其工作。
$string = "Rock/Classic 80’s-90’s";
$replace = "’";
$string = str_replace($replace, "", $string);
echo "<p>$string</p>";
【讨论】:
是的,我想看看@GDP 的第一个答案。 Microsoft 编码问题是有道理的。以上是关于如何在 PHP 中去除特殊的引号字符?的主要内容,如果未能解决你的问题,请参考以下文章
php 如何过滤 单引号 双引号 $ < > 等N种特殊符号?谢谢
VBA中字符变量双引号如何去除?我的变量赋值使用时因为是字符变量自带了双引号导致赋值后无法识别