反向引用 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
你能帮我找到 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