正则表达式并用preg_replace替换双撇号

时间:2011-02-12 20:54:03

标签: php regex preg-replace

我有几行需要更新,其中双撇号在某些位置被替换而被删除而不是其他位置。

所以:

(2, 'Name 2', '', 8, 0, 0, 1, 'Info blah blah', 0, 4), 
(3, 'Name 3', 'A normal bit of information', 8, 1, 0, 1, 'Info more blah', 0, 4),
(45, 'Name 45', 'Info with '' in it like it''s stuff', 356, 10, 1, 1, '', 0, 9)

需要成为:

(2, 'Name 2', '', 8, 0, 0, 1, 'Info blah blah', 0, 4), 
(3, 'Name 3', 'A normal bit of information', 8, 1, 0, 1, 'Info more blah', 0, 4),
(45, 'Name 45', 'Info with \'\' in it like it\'\'s stuff', 356, 10, 1, 1, '', 0, 9)

尝试各种方法时,我设法用\'\'更新所有'',然后打破以后使用的函数。

3 个答案:

答案 0 :(得分:1)

嗯,这真的需要一些解析。如果你使用正则表达式,它实际上只能在最好的赌注基础上工作。

如果您可以认为'',始终是CSV列表中的空字符串,则可以选择查找逗号。但是,如果其中一个字符串在双引号后面包含逗号,那么这将失败:

preg_replace("/''(?![,)])/", "\\'\\'", $text);

要添加一些安全性,您可以添加前缀检查,例如(?<=[(\s]) - 但这只会有所帮助。

答案 1 :(得分:1)

'(([^']*?)('{2})([^']*?))+'([,|\)])

这应该可以被'$1\'\'$4'$5替换,并且只会在单引号中匹配2个单引号,尽管文字后面会出现逗号。

答案 2 :(得分:1)

s/(?<=')([^',]*)''(?=[^',]*')/$1\\'\\'/g

请记住,您不能在以后更改游戏并在分隔符'(')'之间允许单个撇号,因为这与'('')'无法匹配。 OK?

use strict;
use warnings;

my @data = (
"(2, 'Name 2', '', 8, 0, 0, 1, 'Info blah blah', 0, 4), ",
"(3, 'Name 3', 'A normal bit of information', 8, 1, 0, 1, 'Info more blah', 0, 4),",
"(45, 'Name 45', 'Info with '' in it like it''s stuff', 356, 10, 1, 1, '', 0, 9)",
"''''' ','''',''''",
);

for (@data) {
    print "\n$_\n";
    if (
          s/ (?<=')([^',]*) '' (?= [^',]*')/$1\\'\\'/xg
       )
    {
       print "==>\t$_\n";
    }
}

输出:
(2, 'Name 2', '', 8, 0, 0, 1, 'Info blah blah', 0, 4),
(3, 'Name 3', 'A normal bit of information', 8, 1, 0, 1, 'Info more blah', 0, 4),
(45, 'Name 45', 'Info with '' in it like it''s stuff', 356, 10, 1, 1, '', 0, 9)
==> (45, 'Name 45', 'Info with \'\' in it like it\'\'s stuff', 356, 10, 1, 1, '', 0, 9)
''''' ','''',''''
==> '\'\'\'\' ','\'\'','\'\''