Есть xml файл выгруженный в строку вида
<catalog>
<item id="111" name="Тут может содержаться ; которую не надо заменять" property="Дата;Имя;
2017-01-01;Ivan;
2017-02-02;Vova;" />
<item id="112" name="Тут может содержаться ; которую не надо заменять" property="Дата;Имя;
2017-01-02;Ivan;
2017-02-03;Vova;" />
</catalog>
Ни как не могу привести код к виду
<catalog>
<item id="111" name="Тут может содержаться ; которую не надо заменять" property="Дата!тут мой символ1! Имя!тут мой символ1!!тут мой символ2!2017-01-01!тут мой символ1!Ivan!тут мой символ1!!тут мой символ2!2017-02-02!тут мой символ1!Vova!тут мой символ1!" />
<item id="112" name="Тут может содержаться ; которую не надо заменять" property="Дата!тут мой символ1! Имя!тут мой символ1!!тут мой символ2!2017-01-02!тут мой символ1!Ivan!тут мой символ1!!тут мой символ2!2017-02-03!тут мой символ1!Vova!тут мой символ1!" />
</catalog>
То есть мне необходимо заменить все переносы строк на !тут мой символ2!, а все точки с запятой на !тут мой символ1!, но тольк внутри атрибута property.
Вариант с использованием регулярных выражений:
<?php
$xml = '<catalog>
<item id="111" name="Тут может содержаться ; которую не надо заменять" property="Дата;Имя;
2017-01-01;Ivan;
2017-02-02;Vova;" />
<item id="112" name="Тут может содержаться ; которую не надо заменять" property="Дата;Имя;
2017-01-02;Ivan;
2017-02-03;Vova;" />
</catalog>';
$symb_1 = '!тут мой символ1!'; // Замена точки с запятой
$symb_2 = '!тут мой символ2!'; // Замена переносов
echo preg_replace_callback(
'~property="[^"]+"~',
function ($m) use ($symb_1, $symb_2) {
if (!empty($m[0])) {
$patt = ['~;~', "~\n~", '~\s{2,}~'];
$symb = [$symb_1, $symb_2, null];
return preg_replace($patt, $symb, $m[0]);
}
},
$xml
);
Продвижение своими сайтами как стратегия роста и независимости