Помогите разобрать html строку на значения и вывести на сайте

user99

Постоялец
Регистрация
13 Янв 2008
Сообщения
141
Реакции
15
Есть стандартная строка из XMPP протокола, <message from="От кого" to="Кому" type="chat"><body>Сообщение.</body></message>

Получаем эти строки из БД и выводим на странице, как видно из синтаксиса если записать несколько таких строк то на странице будет видно только "сообщение", все остальное будет присутствовать в html коде но не будет видно пользователю. Задача реализовать отображение в формате вида

От ..., текст сообшения
От ..., текст сообшения
От ..., текст сообшения итд.

Пример xmpp строчка

<message from="test1@ya.ru" to="test2@ya.ru type="chat"><body>Сообщение.</body></message>
Должна выглядеть:
От: test1@ya.ru, Сообщение.

Гуру php помогите пожалуйста, несколько дней ломаю голову но не получается.
 
похоже это простой xml тогда
PHP:
$xmlstr = <<<XML
<message from="test1@ya.ru" to="test2@ya.ru" type="chat">
<body>Сообщение.</body>
</message>
XML;

$xml = new SimpleXMLElement($xmlstr);

echo 'От: <a href="mailto:'.$xml->attributes()->from.'">'.$xml->attributes()->from.'</a>, '.$xml->body;
или распартить с preg_match
 
Ну вот вернулись мы к старой доброй теме. Строчка приобрела другой формат, и появилась ошибка "SimpleXMLElement->__construct('') #1 {main} thrown in".

<message from='ot@test1.ru/client' to='komy@test2.ru' xml:lang='ru' type='chat' id='1239'><body>Это должно вывести на сайте!</body><delay xmlns='urn:xmpp:delay' from='192.168.111.101' stamp='2011-01-19T13:52:08Z'>Offline Storage</delay><x xmlns='jabber:x:delay' stamp='20110119T13:52:08'/></message>

Нужно вывести сообщение вида:

От: ot@test1.ru (client), Это должно вывести на сайте!

Где ot@test1.ru является так же ссылкой mailto:...
 
странно ошибки не должно структура xml не поменялась только добавились теги, значит проблема в другом месте, а этот код работает. А тут добавлено для client
PHP:
<?
$xmlstr = <<<XML
<message from='ot@test1.ru/client' to='komy@test2.ru' xml:lang='ru' type='chat' id='1239'>
    <body>Это должно вывести на сайте!</body>
    <delay xmlns='urn:xmpp:delay' from='192.168.111.101' stamp='2011-01-19T13:52:08Z'>Offline Storage</delay>
    <x xmlns='jabber:x:delay' stamp='20110119T13:52:08'/>
</message>
XML;

$xml = new SimpleXMLElement($xmlstr);

$client = explode("/", $xml->attributes()->from);
if($client[1])$client[1] = ' ('.$client[1].')';

echo 'От: <a href="mailto:'.$client[0].'">'.$client[0].'</a>'.$client[1].', '.$xml->body; 

?>
А ошибка может быть если поменялась структура, может там список сообщений, много <message> в каком нибудь корневом теге, тогда цикл по всем сообщениям
PHP:
<?
$xmlstr = <<<XML

<root>

<message from='ot@test1.ru/client' to='komy@test2.ru' xml:lang='ru' type='chat' id='1239'>
    <body>1 Это должно вывести на сайте!</body>
    <delay xmlns='urn:xmpp:delay' from='192.168.111.101' stamp='2011-01-19T13:52:08Z'>Offline Storage</delay>
    <x xmlns='jabber:x:delay' stamp='20110119T13:52:08'/>
</message>

<message from='ot@test1.ru/client' to='komy@test2.ru' xml:lang='ru' type='chat' id='1239'>
    <body>2 Это должно вывести на сайте!</body>
    <delay xmlns='urn:xmpp:delay' from='192.168.111.101' stamp='2011-01-19T13:52:08Z'>Offline Storage</delay>
    <x xmlns='jabber:x:delay' stamp='20110119T13:52:08'/>
</message>

<message from='ot@test1.ru/client' to='komy@test2.ru' xml:lang='ru' type='chat' id='1239'>
    <body>3 Это должно вывести на сайте!</body>
    <delay xmlns='urn:xmpp:delay' from='192.168.111.101' stamp='2011-01-19T13:52:08Z'>Offline Storage</delay>
    <x xmlns='jabber:x:delay' stamp='20110119T13:52:08'/>
</message>

</root>

XML;

$xml_root = new SimpleXMLElement($xmlstr);

foreach($xml_root as $xml){
    $client = explode("/", $xml->attributes()->from);
    if($client[1])$client[1] = ' ('.$client[1].')';
    
    echo 'От: <a href="mailto:'.$client[0].'">'.$client[0].'</a>'.$client[1].', '.$xml->body.'<br />';
}
 
Кавычки стали ' а были " может в этом проблема?
 
может через форму проходит xml с кавычками и php экранирует их на \' тогда надо через stripslashes профильтровать xml
PHP:
...
$xml = new SimpleXMLElement(stripslashes($xmlstr));
...
 
Ну все получилось вывести, $xml = new SimpleXMLElement(stripslashes($xmlstr)); не потребовалось, надеюсь структура больше не измениться ну по крайне мерее в ближайшее время, если что напишу ).
 
polyetilen , Подскажите пожалуйста как из строчки вида
PHP:
<vCard xmlns='vcard-temp'><FN>Polnoe</FN><NICKNAME>Ник</NICKNAME><N><GIVEN>фирстнаме</GIVEN><FAMILY>ластнаме</FAMILY></N><BDAY>01.20.15</BDAY><EMAIL><USERID>mmm@mail.ru</USERID></EMAIL><TEL><NUMBER>+711122333</NUMBER></TEL><URL>http://ya.ru</URL><ADR><STREET>Улица</STREET><LOCALITY>Город</LOCALITY><PCODE>Индекс</PCODE><CTRY>Страна</CTRY></ADR><DESC>О себе коротко и ясно</DESC></vCard>
Можно значения (то что написано по русски это значения ну и телефон с датой, просто писал что бы было понятно какое значение из какого поля) записать в переменный для дальнейшей работы с ними?
 
SimpleXMLElement переводит в объекты и так что остаётся только добраться до нужного объекта, удобно выводить дерево объектов с функцией print_r для наглядности
PHP:
<?
$xmlstr = <<<XML
<vCard xmlns='vcard-temp'><FN>Polnoe</FN><NICKNAME>Ник</NICKNAME><N><GIVEN>фирстнаме</GIVEN><FAMILY>ластнаме</FAMILY></N><BDAY>01.20.15</BDAY><EMAIL><USERID>mmm@mail.ru</USERID></EMAIL><TEL><NUMBER>+711122333</NUMBER></TEL><URL>http://ya.ru</URL><ADR><STREET>Улица</STREET><LOCALITY>Город</LOCALITY><PCODE>Индекс</PCODE><CTRY>Страна</CTRY></ADR><DESC>О себе коротко и ясно</DESC></vCard>
XML;

$xml = new SimpleXMLElement($xmlstr);

echo '<pre>';
print_r($xml);
echo '</pre>';

//Polnoe
echo $xml->FN;
//BDAY
echo $xml->BDAY;
//USERID
echo $xml->EMAIL->USERID;
?>
 
Все ок, но есть ошибки вида

Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: namespace warning : xmlns: URI vcard-temp is not absolute

Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: <vCard xmlns='vcard-temp'><FN>Polnoe</FN><NICKNAME>Ник</NICKNAME><N><GIVEN>ф

Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: ^

возможно исправить без отключения отображения ошибок?
 
Назад
Сверху