【发布时间】:2017-07-27 18:55:11
【问题描述】:
有什么方法可以在 PHP 中删除字符串中间的撇号,但不是在开头或结尾?
例如,我有一个类似的字符串
'the cat jumped over the dog's lazy body'
开始和结束引号在字符串中并且很重要,因为它们描述了来自 MySQLDump(由 BullZip 创建,如果这很重要)的记录中的字段。
所以在上下文中,记录类似于
INSERT INTO `SOMETABLE` () VALUES (1, '32295', NULL, 'RII20109', 'the cat jumped over the dog's lazy body', '11');
我需要一种方法来转义(或删除)文本中间的引号,而不是开头或结尾的引号。我已经尝试了各种 str_replace 选项,但我觉得我需要一位正则表达式大师来帮忙,因为我无法定位我想要更改的报价。
我使用的整个过程是读取传入的文件并将其切碎
$queries = explode(";", str_replace("\n\r", '', $sql));
然后使用 MySQL 查询执行每一行。中间的撇号把事情搞砸了。
更新
抱歉 - 事后看来,我的问题确实不是很清楚,并导致一些人走错了路。我正在使用的字符串实际上是 整个 行:
INSERT INTO `SOMETABLE` () VALUES (1, '32295', NULL, 'RII20109', 'the cat jumped over the dog's lazy body', '11');
不只是其中的一部分,正如我在开始时错误地提到的那样。我的错。因此,正如 sin 所暗示的那样,实际上没有办法知道我应该使用哪个撇号,除非我将这条线拉得更远(以某种方式抓住 VALUES () 部分,然后分解内容,然后使用建议的技术个别领域。天哪!别以为我能做到!
BullZip 是一个 MS Access 到 MySQL 的导出程序,是的,我相信它不应该让我如此悲伤。它应该转义字段间撇号,但似乎没有设置让它这样做。
另一个更新
令我非常尴尬的是,经过更多测试后,我发现 BullZip 按应有的方式处理引号,并以斜线转义。仔细检查后,冒犯的字符不是撇号,而是那些讨厌的 MS Word “特殊”引号 (') 之一,我当然可以用所有常用技术修复它。很抱歉浪费大家的时间:(
【问题讨论】:
-
要匹配中间的
'可以使用:(?<=\w)'(?=\w) -
等等,我觉得我误解了这个问题。 @anubhava 的建议似乎正是您想要的。
-
你找不到这样的引语并从中获得任何意义。您必须知道它们与记录的其余部分的关系。除非它这样做,否则你不知道发生了什么。
INSERT INTO SOMETABLE () VALUES (1, '32295', NULL, 'RII20109', 'the cat jumped over the dog,'s lazy body', '11'); -
这似乎有效,但是
$queries = preg_split("/(;\r\n|;\n\r|;\n|;\r)/", $sql);。