Я пытаюсь выполнить простую замену некоторых входных данных, которые можно описать следующим образом:
- взять регулярное выражение
- принять входной поток данных
- в каждом совпадении, заменить совпадение с помощью обратного вызова
К сожалению, preg_replace_callback () не работает так, как я ожидал. Это дает мне все совпадения по всей линии, а не отдельные совпадения. Поэтому мне нужно снова соединить линию после замены, но у меня нет информации, чтобы сделать это. Показательный пример:
<?php
echo replace("/^\d+,(.*),(.*),.*$/", "12,LOWERME,ANDME,ButNotMe")."\n";
echo replace("/^\d+-\d+-(.*) .* (.*)$/", "13-007-THISLOWER ThisNot THISAGAIN")."\n";
function replace($pattern, $data) {
return preg_replace_callback(
$pattern,
function($match) {
return strtolower($match[0]);
}, $data
);
}
https://www.tehplayground.com/hE1ZBuJNtFiHbdHO
дает мне 12,lowerme,andme,butnotme
, но я хочу 12,lowerme,andme,ButNotMe
.
Я знаю, что использование $ match [0] неправильно. Это просто для иллюстрации здесь. Внутри замыкания мне нужно запустить что-то вроде
foreach ($match as $m) { /* do something */ }
Но, как я уже сказал, у меня нет информации о положении совпадений во входной строке, что делает невозможным повторное соединение строки.
Я просмотрел документацию по PHP, а также несколько поисков и не смог найти решение.
Разъяснения:
Я знаю, что $ match [1], $ match [2] ... и т. Д. Содержат совпадения. Но только строка, а не позиция. Представьте, что в моем примере последняя строка также ANDME вместо ButNotMe - согласно регулярному выражению она должна соответствовать , а не , и к ней должен применяться обратный вызов , а не . Вот почему я использую регулярные выражения вместо замены строк.
Кроме того, причина, по которой я использую группы захвата таким образом, заключается в том, что мне нужно, чтобы процесс замены был настраиваемым. Поэтому я не могу жестко закодировать что-то вроде «заменить № 1 и № 2, но не № 3». В другом входном файле позиции могут отличаться, или может потребоваться больше замен, и должно измениться только используемое регулярное выражение.
Так что, если мой ввод "15,LOWER,ME,NotThis,AND,ME,AGAIN"
, я хочу иметь возможность просто изменить регулярное выражение, а не код и получить желаемый результат. Как правило, $ pattern и $ data являются переменными.