Задать вопрос
@nata32

Как составить регулярное выражение?

Добрый день, есть такой код
$xml = file_get_contents($url);
preg_match_all('/<param name="(.*?)"/ism',$xml,$matches);
if (isset($matches[1]) && sizeof($matches[1])){
        $data['params'] = array_unique($matches[1]);
    }

то есть из файла xml из строк типа
<param name="Срок гарантии" unit="мес.">36+24</param>

вытаскивается то что в атрибуте name, то есть к примеру, Срок гарантии, соответственно получаем массив из этих значений.
Можно ли регуляркой вытащить значения из 2 атрибутов, если unit не пустой, name и unit ? Что бы на выходе получилось
Срок гарантии, мес.
Пробовала так
preg_match_all('/<param name="([^"]*)" unit="([^"]*)"/ism',$xml,$matches);

значения вытаскиваются, но получается 2 массива
Спасибо.
  • Вопрос задан
  • 189 просмотров
Подписаться 1 Средний 1 комментарий
Помогут разобраться в теме Все курсы
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Stepik
    PHP (pro)
    2 недели
    Далее
Решения вопроса 1
opium
@opium
Просто люблю качественно работать
preg_match_all так и работает — отдельный массив на каждую группу. Склеиваешь руками:

$result = [];
foreach ($matches[1] as $i => $name) {
    if ($matches[2][$i] !== '') {
        $result[] = $name . ', ' . $matches[2][$i];
    }
}
$data['params'] = array_unique($result);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
nefone
@nefone
Junior PHP разработчик
Использовать регулярные выражение - это обязательное условие?

Намного надежнее и правильнее будет решить эту задачу с помощью DOMDocument
$xml = file_get_contents($url);
$dom = new DOMDocument();
$dom->loadXML($xml);
$params = $dom->getElementsByTagName('param');
$data['params'] = []; 
foreach ($params as $param) {
    if ($param->hasAttribute('unit') && trim($param->getAttribute('unit')) !== '') {
        // Ищем нужные данные в xml документе 
        $name = $param->getAttribute('name');
        $unit = $param->getAttribute('unit');        
        // Собираем строку и добавляем в массив
        $data['params'][] = $name . ', ' . $unit;
    }
}
$data['params'] = array_unique($data['params']);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы