我不确定问两次是否正确。我已经问过以下问题,我找到了一个很好的解决方案。不幸的是,我发现了一种与此解决方案无关的组合。我尝试了很多来修改解决方案,但我没有工作。我还添加了一条评论,但似乎没有人评论这条评论,为什么我要再次提出我的问题:
我想替换字符串中的字符,但仅当此字符位于其他两个字符之间时。在我的情况下,我想要替换所有;在双引号之间。 因此我得到了一些示例字符串:
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>
答案 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"
?>