дополнить часть строки через регулярку

125
11 июня 2019, 23:50

Задача звучит так: Напишите скрипт, который найдёт в строке все даты и заменит их на дату с днем недели

<?php
$str = 'Давайте устроим встречу 20.05.2022 и потом ещё одну 12.06.2022';
// ЗДЕСЬ НУЖЕН КОД
echo $str; // Давайте устроим встречу 20.05.2022 (пт) и потом ещё одну 12.06.2022 (вс).

Ее я выполнил так:

<?php
$str = 'Давайте устроим встречу 20.05.2029 и потом ещё одну 09.06.2022';
$n = preg_match_all('/\d{2}\.\d{2}.\d{4}/', $str, $matches);
$new = [];
foreach ($matches as $date => $values) {
    foreach ($values as $key => $value) {
            $new[] = $value.' '.date("D", strtotime($value));
    }
}
str_replace($matches, $new, $str);
echo $str;

Не работает. В чем косяк?

Answer 1

Для этих целей оптимально будет подходить preg_replace_callback():

$result = preg_replace_callback("/\d{2}\.\d{2}\.\d{4}/", function($match){
                 $day = date("D", strtotime($match[0]));
                 return "{$match[0]} ($day)";
            }, $str);

хотя с другой стороны, можно еще и убедиться что у нас представлена действительно дата, например, используя checkdate.

$result = preg_replace_callback("/(\d{2})\.(\d{2})\.(\d{4})/", function($match){
                list($full, $d, $m, $y) = $match;
                if(!checkdate($m, $d, $y)) return $full;
                $day = date("D", mktime(0,0,0, $m,$d,$y));
                return "$full ($day)";
            }, $str);
Answer 2
<?php
$str = 'Давайте устроим встречу 20.05.2029 и потом ещё одну 09.06.2022';
preg_match_all('/\d{2}\.\d{2}.\d{4}/', $str, $matches);
$search = [];
$replace = [];
foreach ($matches as $date => $values) {
    foreach ($values as $key => $value) {
            $search[] = $value;
            $replace[] = $value.' '.date("D", strtotime($value));
    }
}
$str = str_replace($search, $replace, $str);
echo $str;
Answer 3
echo str_replace($matches, $new, $str);
Answer 4

str_replace - эта функция возвращает строку или массив с замененными значениями(Не меняет исходную).

READ ALSO
Не могу получить все cookie

Не могу получить все cookie

Использую CURL для получения данных с сайтаЕсли просматривать эту ссылку в браузере - там есть много cookie

143
Где допущена ошибка в WHILE цикле?

Где допущена ошибка в WHILE цикле?

Есть 2 запросаОдин по определенному пользователю, а другой по целому массиву пользователей

134
Принципы построения API

Принципы построения API

Хотелось бы получить наводки на ресурсы\книги, где можно систематизировать знания по построению правильного APIТак-то свои API я делал, строил...

167
Как при селекте, менялись значения в другой форме?

Как при селекте, менялись значения в другой форме?

как сделать, чтобы при смене селекта (он отсылается к типам записи) Менялись на значения той записи, которую выбратьПоля во всех записях одинаковые

124