Xpath Regex в PHP не работает

Вот мой XML, который возвращается:

<?xml version="1.0" encoding="utf-8"?> <lists> <list> <id>6791</id> <title><![CDATA[List 1]]></title> <type>0</type> <priority>0</priority> <due><![CDATA[0000-00-00 00:00:00]]></due> <notes><![CDATA[]]></notes> <user_id>49211</user_id> <owner><![CDATA[]]></owner> <item1> <done>0</done> <title><![CDATA[Bamboo Montage-83 Knee High Studded Contrast Colored Zipper Riding Boot - Brown PU]]></title> <barcode>B00H2Y2UY6</barcode> <priority>2</priority> <item_id>57741</item_id> </item1> <item2> <done>0</done> <title><![CDATA[List 2]]></title> <barcode><![CDATA[]]></barcode> <priority>2</priority> <item_id>57751</item_id> </item2> <item3> <done>0</done> <title><![CDATA[List Item 1]]></title> <barcode><![CDATA[]]></barcode> <priority>2</priority> <item_id>57761</item_id> </item3> </list> 

Я хотел получить узел list->item[0-9] который добавлен с номером. Я использую класс SimpleXMLElement PHP для их получения, но я не могу получить узел с регулярным выражением здесь, это мой код:

  foreach ($list_xml->lists->xpath("/list/^item[0-9]$") as $listItem) { echo $listItem->title; } 

Заметьте, что дамп $ list_xml выглядит так:

 SimpleXMLElement Object ( [lists] => SimpleXMLElement Object ( [list] => Array ( [0] => SimpleXMLElement Object ( [id] => 6791 [title] => SimpleXMLElement Object ( ) [type] => 0 [priority] => 0 [due] => SimpleXMLElement Object ( ) [notes] => SimpleXMLElement Object ( ) [user_id] => 49211 [owner] => SimpleXMLElement Object ( ) [item1] => SimpleXMLElement Object ( [done] => 0 [title] => SimpleXMLElement Object ( ) [barcode] => B00H2Y2UY6 [priority] => 2 [item_id] => 57741 ) [item2] => SimpleXMLElement Object ( [done] => 0 [title] => SimpleXMLElement Object ( ) [barcode] => SimpleXMLElement Object ( ) [priority] => 2 [item_id] => 57751 ) [item3] => SimpleXMLElement Object ( [done] => 0 [title] => SimpleXMLElement Object ( ) [barcode] => SimpleXMLElement Object ( ) [priority] => 2 [item_id] => 57761 ) ) ) ) 

SimpleXmlElement поддерживается libxml2, который поддерживает только XPath 1.0 . XPath 1.0 не поддерживает сопоставление строк с регулярными выражениями, XPath 2.0 делает.

Таким образом, открыты два варианта:

Вариант 1: Оставайтесь с XPath 1.0

В этом случае вы можете попытаться построить на лету запрос xpath для сопоставления всех узлов item* :

 $items=array(); for($i=0; $i<10; $i++) { $items[] = '/list/item' . $i; } $xpath=join($items, '|'); // $xpath == '/list/item1|/list/item2| ...' 

Вариант 2: переход на XPath 2.0

Планируется добавить эту поддержку для PHP. Прочтите этот вопрос: ( Каков наилучший способ использования XSLT 2.0 с PHP? ) Для поиска обходного пути. На момент написания этой статьи он является одним из самых актуальных в этом вопросе.