Remove hyphenation in xml attribute using php

Question:

There is an xml file dumped into a line of the form

<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>

How can I bring the code to the form

    <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>

That is, I need to replace all line breaks with ! Here is my symbol2! , and all semicolons on ! here is my symbol1! but only inside the property attribute.

Answer:

A variant using regular expressions:

<?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
);
Scroll to Top