反向引用 preg_replace 主题中有逗号

Backreference preg_replace with commas in subject

你能帮我找到 preg_replace 语法,这样我就可以在缺少的地方复制价格吗? 主题是:

...nomaterwhat13124123,"321,00",,nomaterwhat
...nomaterwhat12321,"322,20","134,00",nomaterwhat
...nomaterwhat1321,"211,00",,nomaterwhat
...nomaterwhat31313,"241,00",,nomaterwhat

我的输出是:

...nomaterwhat13124123,"321,00","321,00",nomaterwhat
...nomaterwhat12321,"322,20","134,00",nomaterwhat
...nomaterwhat1321,"211,00","211,00",nomaterwhat
...nomaterwhat31313,"241,00","241,00",nomaterwhat

我试过了

preg_replace("(\W+),,nomaterwhat$", ",,nomaterwhat", $string);

如果您使用 str_getcsv,您可以这样做:

$data = "CSV VALUES";

$lines = explode("\n", $data);
foreach ($lines as $line) {
    $temp = str_getcsv($line);
    echo '<pre>' . print_r($temp, true) . '</pre>';
}

然后你可以像这样把它们放到一个数组中:

$data = "CSV VALUES";
$lines = explode("\n", $data);
$output = array();
foreach ($lines as $line) {
    $temp = str_getcsv($line);
    $temp[5] = ($temp[5] == '') ? $temp[4] : $temp[5];
    $output[] = $temp;
}
echo '<pre>' . print_r($output, true) . '</pre>';

$temp[5]替换为第二个价格应该在的地方。

忽略更复杂的情况应该这样做:

$result = preg_replace('/,"(\d+,\d{2})",,nomaterwhat/', ',"",,nomaterwhat', $string);

您的正则表达式存在一些问题。
1. 没有分隔符
2. 没有 m 修饰符所以 $ 是字符串的结尾,而不是行。
3. \W+ 不是 a-z, 0-9, and/or _ 所以你不会得到 反正那里有钱。

试试这个:

$string = '...nomaterwhat13124123,"321,00",,nomaterwhat
...nomaterwhat12321,"322,20","134,00",nomaterwhat
...nomaterwhat1321,"211,00",,nomaterwhat
...nomaterwhat31313,"241,00",,nomaterwhat';
echo preg_replace("/,(\"\d+,\d{2}\"),,nomaterwhat$/m", ",,,nomaterwhat", $string);

输出:

...nomaterwhat13124123,"321,00","321,00",nomaterwhat
...nomaterwhat12321,"322,20","134,00",nomaterwhat
...nomaterwhat1321,"211,00","211,00",nomaterwhat
...nomaterwhat31313,"241,00","241,00",nomaterwhat

正则表达式演示:https://regex101.com/r/hE2zQ7/1

PHP 演示:http://ideone.com/OanPN1