За последние 24 часа нас посетили 22399 программистов и 1045 роботов. Сейчас ищут 727 программистов ...

Прошу помочь с preg_match

Тема в разделе "Регулярные выражения", создана пользователем redxpill, 14 апр 2019.

  1. redxpill

    redxpill Новичок

    С нами с:
    14 апр 2019
    Сообщения:
    4
    Симпатии:
    0
    Приветствую!

    Задача: Выбирать значение поля "Наименование изготовителя" из последовательности:

    object(stdClass)#11913 (1) { ["meta_value"]=> string(921) "a:3:
    {s:145:"%d0%bd%d0%b0%d0%b8%d0%bc%d0%b5%d0%bd%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b7%d0%b3%d0%be%d1%82%d0%be%d0%b2%d0%b8%d1%82%d0%b5%d0%bb%d1%8f";a:6:{s:4:"name";s:49:"Наименование изготовителя";s:5:"value";s:27:"Универсал-Люкс";s:8:"position";i:0;s:10:"is_visible";i:0;s:12:"is_variation";i:0;s:11:"is_taxonomy";i:0;}s:91:"%d0%b2%d0%b8%d0%b4-%d0%bd%d0%be%d0%bc%d0%b5%d0%bd%d0%ba%d0%bb%d0%b0%d1%82%d1%83%d1%80%d1%8b";a:6:{s:4:"name";s:31:"Вид номенклатуры";s:5:"value";s:16:"Продукты";s:8:"position";i:1;s:10:"is_visible";i:0;s:12:"is_variation";i:0;s:11:"is_taxonomy";i:0;}s:91:"%d1%82%d0%b8%d0%bf-%d0%bd%d0%be%d0%bc%d0%b5%d0%bd%d0%ba%d0%bb%d0%b0%d1%82%d1%83%d1%80%d1%8b";a:6:{s:4:"name";s:31:"Тип номенклатуры";s:5:"value";s:10:"Товар";s:8:"position";i:2;s:10:"is_visible";i:0;s:12:"is_variation";i:0;s:11:"is_taxonomy";i:0;}}" }

    Далее код разбил на части c выводом на экран, чтобы изолировать проблему.
    В итоге выдает, что массив $arr - пустой, хотя в массиве $manufacturers - 13 записей есть.
    Составил регулярку и протестировал на https://uvsoftium.ru/php/regexp_all.php - выбирает как надо.

    <?php $pattern = '.изготов\pL+.+\".+\".+\"([\s\pL-]+)\"/Uu'; ?>
    <?php echo count($manufacturers); ?> <br> //
    <?php $manufacturer = $manufacturers[3]; ?>
    <?php echo var_dump($manufacturer); ?> <br>
    <?php echo var_dump($pattern); ?> <br>
    <?php preg_match_all($pattern, $manufacturer, $arr, PREG_PATTERN_ORDER); ?><br>
    <?php echo var_dump($arr); ?>
     
  2. username1

    username1 Новичок

    С нами с:
    23 янв 2019
    Сообщения:
    33
    Симпатии:
    2
    зачем вы пишите echo перед var_dump?
     
  3. Emilien

    Emilien Активный пользователь

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
  4. redxpill

    redxpill Новичок

    С нами с:
    14 апр 2019
    Сообщения:
    4
    Симпатии:
    0
    Возвращает boolean(false)
    --- Добавлено ---
    Да, я еще не на ТЫ с php. Исправил.
     
  5. Emilien

    Emilien Активный пользователь

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    В итоге var_dump показывает что в $manufacturer у тебя объект.
    К содержимому meta_value примени unserialize.
    PHP:
    1. unserialize($manufacturer->meta_value)
     
  6. redxpill

    redxpill Новичок

    С нами с:
    14 апр 2019
    Сообщения:
    4
    Симпатии:
    0
    Применил:
    <?php $manufacturer = unserialize($manufacturers[3]->meta_value); ?>
    <?php var_dump($manufacturer); ?> <br>
    <?php preg_match($pattern, $manufacturer, $arr); ?><br>
    <?php var_dump($arr); ?>
    Возвращает NULL
     
  7. Emilien

    Emilien Активный пользователь

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    @redxpill, там смысл был в том, чтобы сразу получить массив, а не проводить поиски с preg_match.
    PHP:
    1. $manufacturer = unserialize($manufacturers[3]->meta_value);
    2. echo "<pre>", var_export($manufacturer, true), "</pre>";
    Код (Text):
    1. array (
    2.   '%d0%bd%d0%b0%d0%b8%d0%bc%d0%b5%d0%bd%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b7%d0%b3%d0%be%d1%82%d0%be%d0%b2%d0%b8%d1%82%d0%b5%d0%bb%d1%8f' =>
    3.   array (
    4.     'name' => 'Наименование изготовителя',
    5.     'value' => 'Универсал-Люкс',
    6.     'position' => 0,
    7.     'is_visible' => 0,
    8.     'is_variation' => 0,
    9.     'is_taxonomy' => 0,
    10.   ),
    11.   '%d0%b2%d0%b8%d0%b4-%d0%bd%d0%be%d0%bc%d0%b5%d0%bd%d0%ba%d0%bb%d0%b0%d1%82%d1%83%d1%80%d1%8b' =>
    12.   array (
    13.     'name' => 'Вид номенклатуры',
    14.     'value' => 'Продукты',
    15.     'position' => 1,
    16.     'is_visible' => 0,
    17.     'is_variation' => 0,
    18.     'is_taxonomy' => 0,
    19.   ),
    20.   '%d1%82%d0%b8%d0%bf-%d0%bd%d0%be%d0%bc%d0%b5%d0%bd%d0%ba%d0%bb%d0%b0%d1%82%d1%83%d1%80%d1%8b' =>
    21.   array (
    22.     'name' => 'Тип номенклатуры',
    23.     'value' => 'Товар',
    24.     'position' => 2,
    25.     'is_visible' => 0,
    26.     'is_variation' => 0,
    27.     'is_taxonomy' => 0,
    28.   ),
    29. )
     
    redxpill нравится это.
  8. redxpill

    redxpill Новичок

    С нами с:
    14 апр 2019
    Сообщения:
    4
    Симпатии:
    0
    --- Добавлено ---
    Спасибо большое за помощь! Я выбрал нужные значения и снова застрял.
    Но я подозреваю, что можно сделать проще. Я пытаюсь выбрать уникальные значения из атрибута товаров из таких сериализованных строк, сформировать фильтр и вывести все товары соответствующие значению фильтра в каталоге... Woocommerce.