我是否有某种方法可以在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“特殊”引号之一('),当然我可以用所有常用技术来修复。抱歉浪费每个人的时间:(
答案 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)
当你把它们放进去时它会转义。这些将会在回避之前与撇号,反斜杠和双引号完全一致。
为什么要删除有效的标点?