【问题标题】:How to remove an apostrophe from middle of string [closed]如何从字符串中间删除撇号[关闭]
【发布时间】: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);

标签: php mysql regex escaping


【解决方案1】:

如果你有一个包含单引号的字符串,像这样:

$string = "'the dog's lazy body'"; 

为什么不去掉所有的单引号,然后把周围的单引号放回去?

$new = "'" + str_replace("'","",$string) + "'";

【讨论】:

  • 抱歉,我用更多信息更新了问题,这将解释为什么我不能这样做。
【解决方案2】:

(您绝对应该使用 RockwoodON 的答案)

您可以使用后向和前瞻来确保您不在字符串的一端。

(?<=.)'(?=.)

这会检查引号两边是否有一个字符。

问题编辑 1 后:

您所要求的内容是不可能的,有人可以注入 SQL,并且他们的文本与代码无法区分。比如说文本是:

Hello', '11'); DROP TABLE 'SOMETABLE'; -- har har

你会认为真正的代码只是一个注释。

问题编辑 2 后:

好的。

【讨论】:

    【解决方案3】:

    将字符串放入时将其转义。返回时将出现撇号、反斜杠和双引号,与转义前完全相同。

    你到底为什么要删除有效的标点符号?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 2017-03-26
      相关资源
      最近更新 更多