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

Тема в разделе "PHP", создана пользователем user99, 29 мар 2010.

Модераторы: latteo
  1. user99

    user99 Постоялец

    Регистр.:
    13 янв 2008
    Сообщения:
    127
    Симпатии:
    12
    Есть стандартная строка из 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 помогите пожалуйста, несколько дней ломаю голову но не получается.
     
  2. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    похоже это простой 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
     
    user99 нравится это.
  3. user99

    user99 Постоялец

    Регистр.:
    13 янв 2008
    Сообщения:
    127
    Симпатии:
    12
    Ну вот вернулись мы к старой доброй теме. Строчка приобрела другой формат, и появилась ошибка "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:...
     
  4. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    странно ошибки не должно структура 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 />';
    }
     
  5. user99

    user99 Постоялец

    Регистр.:
    13 янв 2008
    Сообщения:
    127
    Симпатии:
    12
    Кавычки стали ' а были " может в этом проблема?
     
  6. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    может через форму проходит xml с кавычками и php экранирует их на \' тогда надо через stripslashes профильтровать xml
    PHP:
    ...
    $xml = new SimpleXMLElement(stripslashes($xmlstr));
    ...
     
  7. user99

    user99 Постоялец

    Регистр.:
    13 янв 2008
    Сообщения:
    127
    Симпатии:
    12
    Ну все получилось вывести, $xml = new SimpleXMLElement(stripslashes($xmlstr)); не потребовалось, надеюсь структура больше не измениться ну по крайне мерее в ближайшее время, если что напишу ).
     
  8. user99

    user99 Постоялец

    Регистр.:
    13 янв 2008
    Сообщения:
    127
    Симпатии:
    12
    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>
    Можно значения (то что написано по русски это значения ну и телефон с датой, просто писал что бы было понятно какое значение из какого поля) записать в переменный для дальнейшей работы с ними?
     
  9. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    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;
    ?>
     
    user99 нравится это.
  10. user99

    user99 Постоялец

    Регистр.:
    13 янв 2008
    Сообщения:
    127
    Симпатии:
    12
    Все ок, но есть ошибки вида

    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]: ^

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