Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > спецсимволы xml


Автор: alligator 23.8.2014, 13:33
Всем доброго времени суток.
Снова к вам с проблемой...
Необходимо удалить ненужные символы двойных кавычек. 
По факту получаю замену тоже на тоже......
Делаю так:
Код

<?PHP

//www.sbnk.ru
//nmbank.ru
//www.nmbank.ru
//edbank.ru
//www.payment.ru
//mcbank.ru
$options=array(
        CURLOPT_URL=>'http://www.mcbank.ru/For_CBRF/Deposits.xml',
        //CURLOPT_HTTPHEADER=>array('Content-Type: text/xml'),
        CURLOPT_HTTPGET=>true,
        CURLOPT_NOBODY=>false,
        CURLOPT_RETURNTRANSFER=>true,
        CURLOPT_FOLLOWLOCATION=>true,
        CURLOPT_MAXREDIRS=>5,
        CURLOPT_SSL_VERIFYPEER =>0,
        CURLOPT_SSL_VERIFYHOST =>0,
        CURLOPT_CONNECTTIMEOUT => 30,
        CURLOPT_TIMEOUT => 30 
);

$ch = curl_init();
curl_setopt_array($ch, $options);
$xml = curl_exec($ch);
$status_code = curl_getinfo($ch,CURLINFO_HTTP_CODE);


$xml=preg_replace('/>\sDocDate/i',' DocDate',$xml);

$xml = implode("\n",array_filter(
                    array_map('trim', 
                    explode("\n", $xml)), 'strlen'));
    $xml = preg_replace('/Name\s?=\s?(?:\"|\')([^а-яё]+?)">/is', "Name=\"$1\">",$xml);


echo $xml;
//$xml_data = new SimpleXMLElement($xml);
//print_r($xml_data);
curl_close($ch);
?>
 

Автор: ksnk 23.8.2014, 14:14
Это кто-ж такие xml'и выдает?  smile Следующий кандидат на отзыв лицензии?

Код

$xml = preg_replace('/Name\s?=\s?([\'"])(.+?)\1>/is', "Name='$2'>",$xml);


Эта регулярка ставит одиночные кавычки вместо двойных у атрибута Name. Это было надо?

Автор: alligator 23.8.2014, 14:29
Цитата(ksnk @  23.8.2014,  15:14 Найти цитируемый пост)
Это кто-ж такие xml'и выдает?  smile Следующий кандидат на отзыв лицензии?

Наверное =) вверху еще целый список. =))

Проверил
Код

$xml = preg_replace('/Name\s?=\s?([\'"])(.+?)\1>/is', "Name='$2'>",$xml);

кавычки экранинуются автоматом хотя magic quotes отключены и simplexml также вываливает кучу ошибок


Автор: alligator 23.8.2014, 15:38
Цитата(alligator @  23.8.2014,  15:29 Найти цитируемый пост)
кавычки экранинуются автоматом хотя magic quotes отключены и simplexml также вываливает кучу ошибок

это поправил, но такое решение не пойдет т.к. у других банков может быть другая ситуация, например:
http://ksib.ru/For_CBRF/Deposits.xml

вопрос остается отрытым.

Автор: ksnk 23.8.2014, 18:53
Тогда, что-то вроде такого
Код

function x_replace($m){
   return 'Name="'.htmlspecialchars($m[2]).'">';
};

$xml=preg_replace('/>\sDocDate/i',' DocDate',$xml);
$xml = implode("\n",array_filter(
                    array_map('trim', 
                    explode("\n", $xml)), 'strlen'));
    $xml = preg_replace_callback('/Name\s?=\s?([\'"])(.+?)\1>/is','x_replace',$xml);

Если версия php позволяет использовать анонимные функции - можно их тут использовать.

Автор: alligator 23.8.2014, 20:35
Цитата(ksnk @  23.8.2014,  19:53 Найти цитируемый пост)
Если версия php позволяет использовать анонимные функции - можно их тут использовать. 

Попробывал, возвращает Name="", хотя данные нормально передаются
Код

$xml = preg_replace_callback('/Name\s?=\s?(?:[\'"])(.+?)">/is', function($name){print_r($name); return 'Name="'.htmlentities($name[1], ENT_QUOTES).'">'; }, $xml);


Решение найдено, но почему-то символ > кодируется в &gt;
Код

$xml = preg_replace_callback('/Name\s?=\s?(?:[\'"])(.+?)">/is', function($name){print_r($name); return 'Name="'.htmlentities($name[1], ENT_QUOTES,"windows-1251").'">'; }, $xml);

Автор: alligator 24.8.2014, 12:28
Вроде сделал, но не получается сделать чтобы регулярка не захватывала последние кавычки.
Код

$xml = preg_replace_callback('/Name\s?=\s?([\'"])([^>]+)/is', 
        function($name){ return 'Name='.$name[1].htmlspecialchars($name[2], ENT_XML1 | ENT_QUOTES, "windows-1251"); }, $xml);

Автор: ksnk 24.8.2014, 13:04
Цитата(ksnk @  23.8.2014,  18:53 Найти цитируемый пост)
'/Name\s?=\s?([\'"])(.+?)\1>/is'

а так не работает?

Автор: alligator 24.8.2014, 13:26
Цитата(ksnk @ 24.8.2014,  14:04)
Цитата(ksnk @  23.8.2014,  18:53 Найти цитируемый пост)
'/Name\s?=\s?([\'"])(.+?)\1>/is'

а так не работает?

Так после замены получается

Код

Name="ОАО НПП &quot;Тест&quot;

Надо
Код

Name="ОАО НПП &quot;Тест&quot;">


а с предыдущей регуляркой получалось
Код

Name="ОАО НПП &quot;Тест&quot;&quot;>


Добавлено @ 13:29
Сделал так:
Код

$xml = preg_replace_callback('/Name\s?=\s?([\'"])(.+?)\1>/is', 
    function($name){ return 'Name='.$name[1].htmlspecialchars($name[2], ENT_XML1 | ENT_QUOTES,"windows-1251").$name[1].'>'; }, $xml);

сейчас проверю на всем списке отпишусь

Автор: ksnk 24.8.2014, 13:30
Код

$xml = preg_replace_callback('/Name\s?=\s?([\'"])(.+?)\1/is', 
        function($name){ return 'Name='.$name[1].htmlspecialchars($name[2], ENT_XML1 | ENT_QUOTES, "windows-1251").$name[1]; }, $xml);

Дык, что мешает добавить туда кавычку?

Добавлено через 1 минуту и 56 секунд
Цитата(alligator @  23.8.2014,  20:35 Найти цитируемый пост)
но почему-то символ > кодируется в &gt;

Это фича такая. В xml в значениях атрибутов таких символов не бывает, вроде как... Впрочем, можно и простым str_replace пользоваться...

Автор: alligator 26.8.2014, 15:29
Все проблемы связанные с кривыми xml решились следующим кодом:
Код
    
    $r = preg_replace_callback('/Name\s?=\s?(['.chr(39).chr(34).'])(.+?)\1\s*?>/is', //Исправление кривого xml    Windows-1251
            function( $name    ){ return    'Name='.$name[1].htmlspecialchars($name[2],    ENT_XML1 | ENT_QUOTES,"windows-1251").$name[1].chr(62);    }, $r);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)