IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Веб-программирование (http://www.imho.ws/forumdisplay.php?f=29)
-   -   Регулярные выражения помогите (http://www.imho.ws/showthread.php?t=113263)

UnOuter 04.01.2007 16:53

Регулярные выражения помогите
 
В общем у меня вопрос по регулярным выражениям, помогите составить его? пожалуйста.
Имеется:
<w3s.response>
<reqn>1234567</reqn>
<retval>dsdsad</retval>
<retdesc>dasdjghj</retdesc>
<invoice id="432" ts="bla bla bla">
<orderid>gfdgdfg</orderid>
<customerwmid>gfdgfd</customerwmid>
</invoice>
</w3s.response>

нужно извелчь значения заключающеся в тегах <reqn></reqn> и в теге invoice id=

то есть в PHP

$str=file_get_contents("x1.xml");
preg_match("регулярное выражение", $str, $stre);
print_r($stre);

и еще, если можно составить выражение для извлечения просто <reqn> </reqn>


PS просьба не предлагать использовать стандартыне PHP функции XML парсинга.

Спасибо надеюсь на вашу помощь!

BorLase 05.01.2007 14:14

зачем забивать гвозди микроскопом?

для этой задачи не регэкспы нужны, а xml-xsl преобразование

вот xsl, который делает то, что тебе надо:

PHP код:

<xsl:stylesheet
    xmlns
:xsl="http://www.w3.org/1999/XSL/Transform" version='1.0'>

    <
xsl:output method="text"/>
    
    <
xsl:template match="/">
          <
xsl:apply-templates select="w3s.response/reqn"/>
          <
xsl:apply-templates select="w3s.response/invoice"/>
    </
xsl:template>

    <
xsl:template match="w3s.response/reqn">
      
reqn: <xsl:value-of select="."/>
    </
xsl:template>
    
    <
xsl:template match="w3s.response/invoice">
      
id: <xsl:value-of select="./@id"/>
    </
xsl:template>

</
xsl:stylesheet

идея, думаю, понятна

Naked 05.01.2007 14:29

Цитата:

UnOuter:
preg_match("регулярное выражение", $str, $stre);
так вроде вот так наверное пойдет:
preg_match (".reqn.(.*)..reqn.", $str1, $str2)
там возможно еще в начале и в конце надо добавить по символу "/" - но это не точно помню, "точка" - это любой символ - просто возможно символы <>/ могут неверно обработаться и их надо экранировать, чтобы это не делать я частенько точку ставлю если это не создает множественности всяких результатов :yees:

UnOuter 05.01.2007 16:38

Цитата:

Сообщение от BorLase
зачем забивать гвозди микроскопом?

для этой задачи не регэкспы нужны, а xml-xsl преобразование

вот xsl, который делает то, что тебе надо:

PHP код:

<xsl:stylesheet
    xmlns
:xsl="http://www.w3.org/1999/XSL/Transform" version='1.0'>

    <
xsl:output method="text"/>
    
    <
xsl:template match="/">
          <
xsl:apply-templates select="w3s.response/reqn"/>
          <
xsl:apply-templates select="w3s.response/invoice"/>
    </
xsl:template>

    <
xsl:template match="w3s.response/reqn">
      
reqn: <xsl:value-of select="."/>
    </
xsl:template>
    
    <
xsl:template match="w3s.response/invoice">
      
id: <xsl:value-of select="./@id"/>
    </
xsl:template>

</
xsl:stylesheet

идея, думаю, понятна

--------------------------------------------------------------------

XML я беру на стороннем сервере!

Цитата:

Сообщение от Naked
так вроде вот так наверное пойдет:
preg_match (".reqn.(.*)..reqn.", $str1, $str2)
там возможно еще в начале и в конце надо добавить по символу "/" - но это не точно помню, "точка" - это любой символ - просто возможно символы <>/ могут неверно обработаться и их надо экранировать, чтобы это не делать я частенько точку ставлю если это не создает множественности всяких результатов :yees:


ну да оно работает но масив имеет такой вид

Array
(
[0] => <reqn>1234567</reqn>
[1] => 1234567
)

а я хотел бы чтобы вот так

Array
(
[0] => 1234567
)

Saruman 05.01.2007 17:46

вырежи лишний элемент из массива, возвращенного функцией. preg_match всегда возвращает в качестве одного из элементов весь стринг, сматченный регэкспом, так что одну только цифровую строку ты не получишь.

BorLase 05.01.2007 18:12

Цитата:

Сообщение от UnOuter
--------------------------------------------------------------------

XML я беру на стороннем сервере!

да какая разница - хоть от Святого Духа :)
Цитата:

а я хотел бы чтобы вот так

Array
(
[0] => 1234567
)
PHP код:

<?php
// $xml and $xsl contain the XML and XSL data

$arguments = array(
     
'/_xml' => $xml,
     
'/_xsl' => $xsl
);

// Allocate a new XSLT processor
$xh xslt_create();

// Process the document
$result xslt_process($xh'arg:/_xml''arg:/_xsl'NULL$arguments); 
if (
$result) {
    print 
"SUCCESS, sample.xml was transformed by sample.xsl into the \$result";
    print 
" variable, the \$result variable has the following contents\n<br>\n";
    print 
"<pre>\n";
    print 
$result;
    print 
"</pre>\n";
}
else {
    print 
"Sorry, sample.xml could not be transformed by sample.xsl into";
    print 
"  the \$result variable the reason is that " xslt_error($xh) . 
    print 
" and the error code is " xslt_errno($xh);
}
xslt_free($xh);
?>

( стыбрено с http://devzone.zend.com/node/view/id/1302#Heading16 )

возьми такой XSL:
PHP код:

<xsl:stylesheet
    xmlns
:xsl="http://www.w3.org/1999/XSL/Transform" version='1.0'>

    <
xsl:output method="text"/>
    
    <
xsl:template match="/">
          <
xsl:apply-templates select="w3s.response/reqn"/>
    </
xsl:template>

    <
xsl:template match="w3s.response/reqn">
      <
xsl:value-of select="."/>
    </
xsl:template>
</
xsl:stylesheet

и ты на выходе в $result получишь свое 1234567

поверь, это гораздо грамотнее, чем применять к XML регэкспы

Saruman 05.01.2007 18:22

и кто ж тут гвозди микроскопом забивает. Если нужно всего лишь взять один стринг из xml-документа и забыть про исходник - зачем запускать xslt-процессор и прочий оверхед? Такое решение будет быстрее, проще, понятнее, короче или в чём его преимущество-то - в философской кошерности?

BorLase 05.01.2007 18:40

уже, как минимум, не один, а два ;) - внутренности тега и содержимое атрибута

а если этот XML изменят так, что появится не атрибут id, а тег <id>? или добавят id к любому другому, не только к <invoice>? тогда решение на регекспах накроется медным тазиком.

зачем создавать себе трудности там, где без этого можно обойтись?

mBreaker 30.01.2007 18:55

а я всё-таки за решение с regexp'ами... далеко не все хостеры подключают xslt процессор к апачу, зато регэкспы 100% у всех прокатят...


Часовой пояс GMT +4, время: 18:08.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.