如何从字符串中间删除撇号

时间:2017-07-27 18:55:11

标签: php mysql regex escaping

我是否有某种方法可以在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');

不仅仅是它的一部分,正如我在开始时误导的那样。我的错。正如罪所暗示的那样,实际上没有办法知道我应该做什么撇号,除非我进一步拉开线(以某种方式抓住VALUES()部分然后爆炸内容然后使用建议的技术个别领域。天啊!别以为我能来这个!

BullZip是MySQL出口程序的MS Access,是的,我相信它不应该让我这么悲伤。它应该逃避场间撇号,但似乎没有设置让它这样做。

另一次更新

令我非常尴尬的是,经过一些更多的测试后,我发现BullZip 正在按原样处理报价,用斜线逃脱。经过仔细审查的违规字符不是撇号,而是那些令人讨厌的MS Word“特殊”引号之一('),当然我可以用所有常用技术来修复。抱歉浪费每个人的时间:(

3 个答案:

答案 0 :(得分:1)

如果您的字符串包含单引号,请执行以下操作:

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

为什么不删除所有单引号,然后将周围的引号放回?

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

答案 1 :(得分:0)

(你绝对应该使用RockwoodON的回答)

您可以使用lookbehind和lookahead来确保您不在字符串的一端。

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

这会检查报价的两边是否有字符。

问题编辑后1:

你要求的是不可能的,有人可以SQL注入,他们的文本将与代码无法区分。比如说文字是:

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

你会认为真正的代码只是一个评论。

问题编辑后2:

确定。

答案 2 :(得分:-1)

当你把它们放进去时它会转义。这些将会在回避之前与撇号,反斜杠和双引号完全一致。

为什么要删除有效的标点?