За последние 24 часа нас посетили 72617 программистов и 3032 робота. Сейчас ищут 1470 программистов ...

Разбить описание на атрибуты

Тема в разделе "PHP для новичков", создана пользователем Dron-Boy, 9 июн 2017.

  1. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Колеги. Вот головы ломаю как разбить допустим вот такое описание

    Цвет - Золотой,Серый
    Стандарт связи 2G + 3G
    Количество SIM-карт 2
    Экран
    Диагональ экрана 5.5 дюйма
    Разрешение экрана
    1920x1080
    Память и процессор
    Процессор
    MTK6737 + Mali-T720
    Количество ядер 4
    Частота процессора 1300 МГц
    Объём оперативной памяти 2 GB
    Объем встроенной памяти 16 GB
    Мультимедиа
    Задняя камера 13 Мп
    Лицевая камера 8 Мп
    Вспышка Светодиодная
    Функции камеры Автофокус
    Питание
    Емкость аккумулятора 3000 мА/ч

    на атрибуты. Думал регуляркой но везде поразному описание оформлено.
    Какие есть предложения? или только ручками?
     
  2. gruth

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

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
    Вот такое регуляркой, а в других вариантах какое отличие?
     
  3. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Знаешь я вот посмотрел они почти все похожи. Думаю можно и регуляркой обойтись. Помоги тогда составить правильную регулярку хотя бы для одного элемента?
     
  4. gruth

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

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
    PHP:
    1. $test = "Цвет - Золотой,Серый
    2. Стандарт связи 2G + 3G
    3. Количество SIM-карт 2";
    4. (?:цвет|окрашен)[-\ ]*(?P<color>[^'.PHP_EOL.']+)
    5. #xui', $test, $matches);
    6. var_dump($matches);exit;
     
  5. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    спасибо щас попробую
     
  6. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Слушай а вот ест у меня регулярка она заменяет все теги на что угодно. только не могу разобраться как сделать что бы она заменяла теги на перенос строки ? знаю что это символ \n
    PHP:
    1. $test = preg_replace("(<[^<>]+>)", '\n', $test);
     
  7. gruth

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

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
    в смысле тег <br> в \n?
    PHP:
    1. $test = preg_replace('#<br\\\?>#', "\n", $html);
    --- Добавлено ---
    В общем по твоему примеру на разных сайтах по разному выглядит список
    Пробуй тогда вот это
    PHP:
    1. $test = "Стандарт связи 2G + 3G
    2. Цвет - Золотой,Серый
    3. Количество SIM-карт 2
    4. Процессор MTK6737 + Mali-T720";
    5.  
    6. $pattern = [
    7.     '#(?:цвет|окрашен)[- ]*([^\n]+)#ui',
    8.     '#(?:процессор|камень)[- ]([^\n]+)#ui',
    9.     '#(?:.*(?:сим|sim))[^\d]*(\d+)#ui',
    10. ];
    11. $replacement = [
    12.     'color=$1',
    13.     'processor=$1',
    14.     'simcards=$1'
    15. ];
    16. $result = preg_filter($pattern, $replacement, $test);
     
  8. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    я щас пытаюсь с этим работать написал вот такие вот условия на каждый атрибут что нужен
    PHP:
    1. preg_match('#(?:цвет|окрашен)[-\ ]*(?P<color>[^'.PHP_EOL.']+)#xui', $test, $matches);
    2. $color = $matches[1];
    3. preg_match('#(?:Стандарт\sсвязи)[-\ ]*(?P<seti>[^'.PHP_EOL.']+)#xui', $test, $matches);
    4. $seti = $matches[1];
    5. preg_match('#(?:Количество\sSIM-карт)[-\ ]*(?P<seti>[^'.PHP_EOL.']+)#xui', $test, $matches);
    6. $sim = $matches[1];
    7. preg_match('#(?:Диагональ\sэкрана|диагональ\sэкрана)[-\ ]*(?P<seti>[^'.PHP_EOL.']+)#xui', $test, $matches);
    8. $diagonal = $matches[1];
    9. preg_match('#(?:Количество\sядер)[-\ ]*(?P<seti>[^'.PHP_EOL.']+)#xui', $test, $matches);
    10. $yader = $matches[1];
    11. preg_match('#(?:Объём\sоперативной\sпамяти|оперативная\sпамять)[-\ ]*(?P<seti>[^'.PHP_EOL.']+)#xui', $test, $matches);
    12. $memory = $matches[1];
    13. preg_match('#(?:Задняя\sкамера|Основная\sкамера)[-\ ]*(?P<seti>[^'.PHP_EOL.']+)#xui', $test, $matches);
    14. $camera = $matches[1];
    --- Добавлено ---
    но он почему то только выводит цвет
    Еще прикол в том что мне текст подается с тегами он как верстка я его обрабатываю вот таким способом
    PHP:
    1. $test = str_replace("</tr>", "|", $test);
    2. $test = strip_tags($test);
    3. $test = str_replace("|", "<br>", $test);
    А после этого пытаюсь регулярками вывести то что мне нужно. Но работает только с цветом почему то
     
  9. gruth

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

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
    Используй preg_filter :)
     
  10. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    ок
    --- Добавлено ---
    а как мне вывести значения по отдельности ну например вывести color.
    пробую так
    PHP:
    1. $result['color']
    не получается
     
  11. gruth

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

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
    Нужно в массив для начала преобразовать строку $result.
     
  12. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    типо так
    PHP:
    1. $result =  (array) $result;
    --- Добавлено ---
    или через explode?
     
  13. gruth

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

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
    Нет, не так :)Ну вот посмотри на что похож текст которые получился? может на ini? Как раз для такого есть функция parse_ini_srting
    PHP:
    1. $result = parse_ini_string($result);
    2. echo $result['color'];
     
    Dron-Boy нравится это.
  14. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    ну все я разбил через explode и буду дальше рабоать с масивом спасибо большое
     
  15. gruth

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

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
  16. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    все норм спасибо. Воспользовался твоим способом