Обратная ссылка preg_replace с запятыми в теме

1

Не могли бы вы помочь мне найти синтаксис 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$", "$1,$1,nomaterwhat", $string);
  • 0
    Это похоже на общий формат CSV, рассматривали ли вы простой цикл с использованием str_getcsv и заменяете значения в этой точке?
  • 0
    Хм Нет ... Честно говоря, я не сделал: P
Показать ещё 3 комментария
Теги:
preg-replace

3 ответа

2
Лучший ответ

Игнорируя более сложные случаи, это должно делать:

$result = preg_replace('/,"(\d+,\d{2})",,nomaterwhat/', ',"$1",$1,nomaterwhat', $string);
  • 0
    Я заметил, что некоторые значения не были заменены. Как-то так ... ,"144,00",,nomaterwhat : S Это выглядит так же ... Странно
2

Если вы используете 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] местом, где должна быть 2-я цена.

  • 0
    Извините за невозможность принять 2 ответа :(
  • 1
    Это круто, технически это не отвечает на ваш вопрос, поскольку это не регулярное выражение, но полезно знать другие способы сделать это.
Показать ещё 1 комментарий
1

У вас есть несколько проблем с вашим регулярным выражением.
1. Без разделителя
2. Нет модификатора m, поэтому $ - это конец строки, а не строка.
3. \W+ - это не az, 0-9 и/или _ поэтому вы все равно не получили бы денежную стоимость.

Попробуйте это:

$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", ",$1,$1,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

Демо-версия Regex: https://regex101.com/r/hE2zQ7/1

PHP Demo: http://ideone.com/OanPN1

Ещё вопросы

Сообщество Overcoder
Наверх
Меню