php preg_replace regex替换字符串

时间:2015-11-19 10:58:11

标签: regex preg-replace

我不确定问两次是否正确。我已经问过以下问题,我找到了一个很好的解决方案。不幸的是,我发现了一种与此解决方案无关的组合。我尝试了很多来修改解决方案,但我没有工作。我还添加了一条评论,但似乎没有人评论这条评论,为什么我要再次提出我的问题:

我想替换字符串中的字符,但仅当此字符位于其他两个字符之间时。在我的情况下,我想要替换所有;在双引号之间。 因此我得到了一些示例字符串:

  

asbas; “ASD;”; ASD; asdadasd; “ASD; adsas”

     

asbas; “ASD:;一个” SD; asdadasd;“ASD:adsas;塔拉斯;阿达斯

     

“asbas”; “” ASD:;一个 “SD”, “asdadasd”; “” ASD:adsas “;” 塔拉斯 “;” 阿达斯“

在我的上一个问题(Question)中,我得到了以下解决方案:

preg_replace ("/(\"[^\";]*);([^\"]*\")/m", "\\1:\\2", 
                   'asbas;"asd;";asd;asdadasd;"asd;adsas"' );

此解决方案效果很好,但仅在这种情况下,双重点的出现是eval。所以第一个示例字符串效果很好,但不是第二个或第三个。

我也试过了:

preg_replace_callback('/"[^"]+"/',
   function ($m) { return str_replace(";", ":", $m[0]); },
   $str);

要澄清我的问题:我需要一个适用于两个示例字符串的正则表达式,并给出以下结果:

  

asbas; “ASD:”; ASD; asdadasd; “ASD:adsas”

     

asbas; “ASD ::一个” SD; asdadasd;“ASD:adsas;塔拉斯;阿达斯

     

“asbas”; “” ASD ::一个 “SD”, “asdadasd”; “” ASD:adsas “;” 塔拉斯 “;” 阿达斯“

只有当分号在双引号之间时才能进行替换。

非常感谢你的帮助和答案。

亲切的问候

马库斯

修改 我的问题的背景是预先准备csv文件。这是一些组合甚至excel不知道如何“正确”处理文件...所以我尝试更改一些字符并解释它,因为我知道文件应该...所以列是一个块“ ......“并用分号分隔。并且知道我想在双引号块之间更改als分号...如果在双引号块中也存在“-character”,则问题会出现。所以我需要正则表达式,甚至在此块中找到分号。< / p>

1 个答案:

答案 0 :(得分:0)

您可以使用preg_replace_callback()str_replace()的组合。请考虑以下代码和解释:

<?php
$str = '"asbas";""asd::a"sd";"asdadasd";""asd:adsas";"taras";"adass"';
echo "$str\n";          // prints out the string
$regex = '/([^"]+)/i';
// captures every character EXLUDING a double quote
// case-insensitive, must be more/equal to 1 character

$str = preg_replace_callback($regex, 
    function($matches) {
        return str_replace(';', '', $matches[0]);
        // replaces every semicolon with '' in the captured group
    },
        $str
    );

echo "$str\n";
// output: "asbas"""asd::a"sd""asdadasd"""asd:adsas""taras""adass"
?>