Добрый день. Надо понять, что именно вы хотите вытащить из $xml — конкретный тег, атрибут, все элементы item и т.п. Пока этого нет, приведу общие рекомендации и несколько готовых примеров (а ещё — более правильный путь для XML).
1) Совет: не парсить сложный XML регулярками — используйте SimpleXML или DOMDocument. Регулярки ломаются на вложенности, namespace и т. п.
Пример с SimpleXML:
$xml = file_get_contents($url);
$sx = simplexml_load_string($xml);
foreach ($sx->channel->item as $item) {
echo (string)$item->title . "\n";
}
2) Если всё же нужна регулярка (для простых случаев), основные моменты:
- В PHP регулярки окружайте разделителем, например '#...#'.
- Флаг s разрешает точке матчить переводы строк, i — нечувствительность к регистру, u — UTF-8.
- Берите захватывающие группы ( ) и потом смотрите $matches[1].
Примеры:
a) Вытянуть содержимое тега <title>...</title> (включая переносы строк):
$re = '#<title[^>]*>(.*?)</title>#siu';
if (preg_match_all($re, $xml, $m)) {
// $m[1] — массив содержимого title
print_r($m[1]);
}
Разбор: <title[^>]*> — открывающий тег, (.*?) — минимальный захват содержимого, </title> — закрывающий. s — чтобы . брал переводы строк, u — UTF-8.
b) Вытянуть атрибут value="...":
$re = '#<tag[^>]*\bvalue="([^"]*)"[^>]*>#siu';
if (preg_match_all($re, $xml, $m)) {
print_r($m[1]); // массив значений атрибута value
}
c) Захватить каждый <item>...</item>:
$re = '#<item\b[^>]*>(.*?)</item>#siu';
preg_match_all($re, $xml, $m);
$items = $m[1];
3) Если теги содержат вложенные теги и сложную структуру — используйте DOM/SimpleXML или XMLReader.
Пример с DOMDocument:
$doc = new DOMDocument();
libxml_use_internal_errors(true);
$doc->loadXML($xml);
foreach ($doc->getElementsByTagName('item') as $item) {
$titles = $item->getElementsByTagName('title');
if ($titles->length) echo $titles->item(0)->nodeValue . "\n";
}
Если подскажете кусок реального $xml и что конкретно вы хотите получить (пример входа и ожидаемый результат), я напишу точную регулярку или готовый SimpleXML/DOM-код.