PankovAlxndr
@PankovAlxndr
Fullstack web developer

Как заменить двойные кавычки на "?

Здравствуйте, есть строка (xml)
<order acode="7102774" ProductName="Какой-то текст "с скобочками", которые нужно заменить" ClientBarCode="" />

мне нужно написать функцию, которая бы заменяла кавычки внутри кавычек, те результат нужен такой
<order acode="7102774" ProductName="Какой-то текст &quot;с скобочками&quot;, которые нужно заменить" ClientBarCode="" />

пробую и не могу придумать preg_replace https://regex101.com/r/QPC7PL/1
  • Вопрос задан
  • 433 просмотра
Пригласить эксперта
Ответы на вопрос 3
mayton2019
@mayton2019
Bigdata Engineer
Друзья я не знаю как вы в PHP работаете с XML. Но любой нормальный XML-API (стриминговый или документ-ориентированный) это делает автоматически. Экранирует gt, lt, amp, quot.

Тот факт что вы зачем то делаете строковую замену говорит о том что вы просто работаете с кастомной строкой. А это неправильный подход.
Ответ написан
Комментировать
erge
@erge
Примус починяю
Нужно сначала разбить текст на группы attribute_name="attribute_value" затем для этих групп вызвать замену и это можно сделать при помощи preg_replace_callback

регулярка для поиска ([^= ]+)="(.*?)"\s+(?=([^= ]+=|\/>))
см. RegEx101

используем ее в preg_replace_callback, находим пары атрибут=значение и заменяем , делая подмену символов в значении через htmlspecialchars

$str = '
<order acode="7102774" ProductName="Какой-то текст "с скобочками", которые нужно заменть" ClientBarCode="" />
   <order acode="7102774" ProductName="Какой-то текст "с скобочками", которые нужно заменть" ClientBarCode="" />
 <order acode="7102774" ProductName="Какой-то текст "с скобочками", которые нужно заменть" ClientBarCode="" />
      <order acode="7102774" ProductName="Какой-то текст "с скобочками", которые нужно заменть" ClientBarCode="" />';

$out = preg_replace_callback(
    '/([^= ]+)="(.*?)"\s+(?=([^= ]+=|\/>))/',
    function($m) {
        return $m[1].'="'.htmlspecialchars($m[2], ENT_QUOTES).'" ';
    },
    $str);
    
echo $out;


см. пример
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы