有没有办法从 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("nr", '', $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 to MySQL导出程序,是的,我相信它不应该给我这种悲伤。它应该转义场间撇号,但似乎没有设置让它这样做。
另一个更新
令我非常尴尬的是,经过更多的测试,我发现 BullZip正在按应有的方式处理报价,并以斜杠转义。经过仔细检查,冒犯性字符不是撇号,而是那些讨厌的MS Word"特殊"引号('(之一,当然我可以用所有常用技术修复。很抱歉浪费大家的时间:(
如果你有一个包含单引号的字符串,如下所示:
$string = "'the dog's lazy body'";
为什么不删除所有单引号,然后将周围的引号放回原处?
$new = "'" + str_replace("'","",$string) + "'";
(你绝对应该使用RockwoodON的答案(
您可以使用后视和前瞻来确保您不在字符串的 1 端。
(?<=.)'(?=.)
这将检查引号的两边是否有字符。
问题后编辑 1:
你所要求的是不可能的,有人可以SQL注入,他们的文本与代码没有区别。例如,假设文本是:
Hello', '11'); DROP TABLE 'SOMETABLE'; -- har har
你会认为真正的代码只是一个注释。
问题后编辑 2:
还行。
放入转义字符串时将其放入。 将返回撇号、反斜杠和双引号,与转义前完全相同。
你到底为什么要删除有效的标点符号?