Первое решение, которое приходит мне в голову, выглядит так:
- извлечь все коды
- удалите коды, заменив их специальным маркером, на который не будут влиять ваши манипуляции со строками - этот маркер должен быть действительно особенным (и вы можете убедиться, что его нет во входной строке, кстати)
- делай свои манипуляции на струне
- верните коды, где сейчас находятся маркеры
В коде это может быть что-то вроде этого:
(извините, это довольно долго - и я не включил ни одного чека; вы можете добавить их)
$str = <<<A
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec sodales lacus et erat accumsan consectetur. Sed lacinia enim vitae erat suscipit fermentum. Quisque lobortis nisi et lacus imperdiet ac malesuada dui imperdiet. <pre><code>ThIs Is
CoDe 1
Donec vestibulum commodo quam rhoncus luctus. Nam vitae ipsum sed nibh dignissim condimentum. Sed ultrices fermentum dapibus. Vivamus Mattis Nisi Nec Enim Convallis Quis Aliquet Arcu Accumsan. Потенциал Suspendisse. Nullam Eget Fringilla Nunc. Нулла Порта Хусто Хусто. Nuncхватка egestas malesuada. Mauris ac nisi ipsum, et accumsan lorem. Quisque interdum accumsan pellentesque. Сед в метисе. Nulla gravida tincidunt tortor,
AnD cOdE 2
nec aliquam tortor ultricies vel. Integer semper libero eu magna conget eget lacinia purus auctor. Nunc volutpat ultricies feugiat. Nullam id mauris eget ipsum ultricies ullamcorper non vel risus. Проин волутпат волутпат интердум. Nulla orci odio, ornare sit amet ullamcorper non, condimentum sagittis libero.
aNd
CoDe
NuMbEr 3
Ut non justo в neque convallis luctus ultricies amet.
A;
var_dump ($ строка);
// Извлекаем коды
$ match = array ();
preg_match_all ('#
(.*?)
# s', $ str, $ match);
var_dump (соответствует $);
// Удалить коды
$ str_nocode = preg_replace ('#
.*?
# s', 'THIS_IS_A_NOCODE_MARKER', $ str);
var_dump ($ str_nocode);
// Делай, что хочешь, с $ str_nocode
$ str_nocode = strtoupper ($ str_nocode);
var_dump ($ str_nocode);
// И вернуть обратно коды:
$ str_codes = $ str_nocode;
foreach ($ соответствует [0] как $ code) {
$ str_codes = preg_replace ('# THIS_IS_A_NOCODE_MARKER #', $ code, $ str_codes, 1);
}
var_dump ($ str_codes);
Я пробовал с:
- код в одной строке,
- код в 2 строки,
- и код в несколько строк
Примечание: вы должны действительно протестировать больше, чем я - но это может дать вам первое представление ...
Надеюсь, это поможет: -)
В качестве примечания: как правило, синтаксический анализ HTML с помощью регулярных выражений считается плохой практикой и часто приводит к проблемам ... Может быть, использование чего-то вроде DOMDocument::loadHTML
может быть хорошей идеей?