Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> спецсимволы xml, удаление двойных кавычек 
V
    Опции темы
alligator
Дата 23.8.2014, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 28.1.2004

Репутация: нет
Всего: 1



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

<?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);
?>
 
PM MAIL   Вверх
ksnk
Дата 23.8.2014, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 12
Всего: 386



Это кто-ж такие xml'и выдает?  smile Следующий кандидат на отзыв лицензии?

Код

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


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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
alligator
Дата 23.8.2014, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 28.1.2004

Репутация: нет
Всего: 1



Цитата(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, 14:30
PM MAIL   Вверх
alligator
Дата 23.8.2014, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 28.1.2004

Репутация: нет
Всего: 1



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

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

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

Это сообщение отредактировал(а) alligator - 23.8.2014, 15:39
PM MAIL   Вверх
ksnk
Дата 23.8.2014, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 12
Всего: 386



Тогда, что-то вроде такого
Код

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 позволяет использовать анонимные функции - можно их тут использовать.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
alligator
Дата 23.8.2014, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 28.1.2004

Репутация: нет
Всего: 1



Цитата(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 - 23.8.2014, 22:37
PM MAIL   Вверх
alligator
Дата 24.8.2014, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 28.1.2004

Репутация: нет
Всего: 1



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

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

PM MAIL   Вверх
ksnk
Дата 24.8.2014, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 12
Всего: 386



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

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


Это сообщение отредактировал(а) ksnk - 24.8.2014, 13:05


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
alligator
Дата 24.8.2014, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 28.1.2004

Репутация: нет
Всего: 1



Цитата(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);

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

Это сообщение отредактировал(а) alligator - 24.8.2014, 13:30
PM MAIL   Вверх
ksnk
Дата 24.8.2014, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 12
Всего: 386



Код

$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 пользоваться...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
alligator
Дата 26.8.2014, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 28.1.2004

Репутация: нет
Всего: 1



Все проблемы связанные с кривыми 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);

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.2094 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.