[PHP] Помогите распарсить строку в массив

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
Духовитин
мл. сержант
Сообщения: 125
Зарегистрирован: 2014-12-17 8:46:05

[PHP] Помогите распарсить строку в массив

Непрочитанное сообщение Духовитин » 2015-02-25 10:44:47

Уважаемые здравствуйте!

У меня такая задача. Я её решил думаю не самым изящным и в плане производительности оптимальным способом. Прошу вашей помощи в более верном варианте.
Есть исходный текст такого формата:

Код: Выделить всё

<---|KEY_1|--->
Содержимое ключа 1
<---END--->
<---|FIELD_3|--->
Содержимое другого ключа
<---END--->
И в результате парсинга мне надо из этого текста получить массив:

Код: Выделить всё

Array(
  "KEY_1"   => "Содержимое ключа 1",
  "FIELD_3" => "Содержимое другого ключа"
)
Сейчас я это реализовал по тупому:
Сперва разбиваю в массив по разделителю "<---END--->"
Затем оббегаю все полученные элементы ивычленяю из них соответственно ключ и значение.

Есть ощущение что это делается проще и изящнее. Помогите пожалуйста.
Кто не рискует - тот не пьёт шампанского.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35454
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

[PHP] Помогите распарсить строку в массив

Непрочитанное сообщение Alex Keda » 2015-02-25 11:47:26

Регуляркой.....
Убей их всех! Бог потом рассортирует...

Аватара пользователя
Духовитин
мл. сержант
Сообщения: 125
Зарегистрирован: 2014-12-17 8:46:05

[PHP] Помогите распарсить строку в массив

Непрочитанное сообщение Духовитин » 2015-02-25 12:12:13

А можно в наглую попросить кусок кода? Потому что с регулярными выражениями я совсем ни в зуб ногой.
Кто не рискует - тот не пьёт шампанского.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35454
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

[PHP] Помогите распарсить строку в массив

Непрочитанное сообщение Alex Keda » 2015-02-25 13:16:02

Аналогично ;(
Убей их всех! Бог потом рассортирует...

Аватара пользователя
Духовитин
мл. сержант
Сообщения: 125
Зарегистрирован: 2014-12-17 8:46:05

[PHP] Помогите распарсить строку в массив

Непрочитанное сообщение Духовитин » 2015-02-25 13:18:06

Ладно, может кто забредёт умеющий этими магическими кракозябрами работать :)
Кто не рискует - тот не пьёт шампанского.

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

[PHP] Помогите распарсить строку в массив

Непрочитанное сообщение FreeBSP » 2015-02-25 15:11:11

чета типа

Код: Выделить всё

/<---|(.*?)|--->(.*?)<---|END|--->/si
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

Аватара пользователя
Духовитин
мл. сержант
Сообщения: 125
Зарегистрирован: 2014-12-17 8:46:05

[PHP] Помогите распарсить строку в массив

Непрочитанное сообщение Духовитин » 2015-02-25 15:26:07

FreeBSP спасибо.
Попробовал, но такая вот конструкция:

Код: Выделить всё

$str='<---|MY_DATA|--->
TEST
<---|END|--->';
$patt='/<---|(.*?)|--->(.*?)<---|END|--->/si';
$arr=Array();
preg_match_all($patt, $str, $arr);
var_dump($arr);
$arr=preg_split($patt, $str);
var_dump($arr);
Выдаёт полнейшую жесть:

Код: Выделить всё

array(3) { [0]=> array(61) { [0]=> string(4) "<---" [1]=> string(0) "" [2]=> string(1) "|" [3]=> string(0) "" [4]=> string(1) "M" [5]=> string(0) "" [6]=> string(1) "Y" [7]=> string(0) "" [8]=> string(1) "_" [9]=> string(0) "" [10]=> string(1) "P" [11]=> string(0) "" [12]=> string(1) "A" [13]=> string(0) "" [14]=> string(1) "G" [15]=> string(0) "" [16]=> string(1) "E" [17]=> string(0) "" [18]=> string(1) "1" [19]=> string(0) "" [20]=> string(1) "|" [21]=> string(0) "" [22]=> string(1) "-" [23]=> string(0) "" [24]=> string(1) "-" [25]=> string(0) "" [26]=> string(1) "-" [27]=> string(0) "" [28]=> string(1) ">" [29]=> string(0) "" [30]=> string(1) " " [31]=> string(0) "" [32]=> string(1) "T" [33]=> string(0) "" [34]=> string(1) "E" [35]=> string(0) "" [36]=> string(1) "S" [37]=> string(0) "" [38]=> string(1) "T" [39]=> string(0) "" [40]=> string(1) " " [41]=> string(4) "<---" [42]=> string(0) "" [43]=> string(1) "|" [44]=> string(0) "" [45]=> string(1) "E" [46]=> string(0) "" [47]=> string(1) "N" [48]=> string(0) "" [49]=> string(1) "D" [50]=> string(0) "" [51]=> string(1) "|" [52]=> string(0) "" [53]=> string(1) "-" [54]=> string(0) "" [55]=> string(1) "-" [56]=> string(0) "" [57]=> string(1) "-" [58]=> string(0) "" [59]=> string(1) ">" [60]=> string(0) "" } [1]=> array(61) { [0]=> string(0) "" [1]=> string(0) "" [2]=> string(1) "|" [3]=> string(0) "" [4]=> string(1) "M" [5]=> string(0) "" [6]=> string(1) "Y" [7]=> string(0) "" [8]=> string(1) "_" [9]=> string(0) "" [10]=> string(1) "P" [11]=> string(0) "" [12]=> string(1) "A" [13]=> string(0) "" [14]=> string(1) "G" [15]=> string(0) "" [16]=> string(1) "E" [17]=> string(0) "" [18]=> string(1) "1" [19]=> string(0) "" [20]=> string(1) "|" [21]=> string(0) "" [22]=> string(1) "-" [23]=> string(0) "" [24]=> string(1) "-" [25]=> string(0) "" [26]=> string(1) "-" [27]=> string(0) "" [28]=> string(1) ">" [29]=> string(0) "" [30]=> string(1) " " [31]=> string(0) "" [32]=> string(1) "T" [33]=> string(0) "" [34]=> string(1) "E" [35]=> string(0) "" [36]=> string(1) "S" [37]=> string(0) "" [38]=> string(1) "T" [39]=> string(0) "" [40]=> string(1) " " [41]=> string(0) "" [42]=> string(0) "" [43]=> string(1) "|" [44]=> string(0) "" [45]=> string(1) "E" [46]=> string(0) "" [47]=> string(1) "N" [48]=> string(0) "" [49]=> string(1) "D" [50]=> string(0) "" [51]=> string(1) "|" [52]=> string(0) "" [53]=> string(1) "-" [54]=> string(0) "" [55]=> string(1) "-" [56]=> string(0) "" [57]=> string(1) "-" [58]=> string(0) "" [59]=> string(1) ">" [60]=> string(0) "" } [2]=> array(61) { [0]=> string(0) "" [1]=> string(0) "" [2]=> string(0) "" [3]=> string(0) "" [4]=> string(0) "" [5]=> string(0) "" [6]=> string(0) "" [7]=> string(0) "" [8]=> string(0) "" [9]=> string(0) "" [10]=> string(0) "" [11]=> string(0) "" [12]=> string(0) "" [13]=> string(0) "" [14]=> string(0) "" [15]=> string(0) "" [16]=> string(0) "" [17]=> string(0) "" [18]=> string(0) "" [19]=> string(0) "" [20]=> string(0) "" [21]=> string(0) "" [22]=> string(0) "" [23]=> string(0) "" [24]=> string(0) "" [25]=> string(0) "" [26]=> string(0) "" [27]=> string(0) "" [28]=> string(0) "" [29]=> string(0) "" [30]=> string(0) "" [31]=> string(0) "" [32]=> string(0) "" [33]=> string(0) "" [34]=> string(0) "" [35]=> string(0) "" [36]=> string(0) "" [37]=> string(0) "" [38]=> string(0) "" [39]=> string(0) "" [40]=> string(0) "" [41]=> string(0) "" [42]=> string(0) "" [43]=> string(0) "" [44]=> string(0) "" [45]=> string(0) "" [46]=> string(0) "" [47]=> string(0) "" [48]=> string(0) "" [49]=> string(0) "" [50]=> string(0) "" [51]=> string(0) "" [52]=> string(0) "" [53]=> string(0) "" [54]=> string(0) "" [55]=> string(0) "" [56]=> string(0) "" [57]=> string(0) "" [58]=> string(0) "" [59]=> string(0) "" [60]=> string(0) "" } } 
array(62) { [0]=> string(0) "" [1]=> string(0) "" [2]=> string(0) "" [3]=> string(0) "" [4]=> string(0) "" [5]=> string(0) "" [6]=> string(0) "" [7]=> string(0) "" [8]=> string(0) "" [9]=> string(0) "" [10]=> string(0) "" [11]=> string(0) "" [12]=> string(0) "" [13]=> string(0) "" [14]=> string(0) "" [15]=> string(0) "" [16]=> string(0) "" [17]=> string(0) "" [18]=> string(0) "" [19]=> string(0) "" [20]=> string(0) "" [21]=> string(0) "" [22]=> string(0) "" [23]=> string(0) "" [24]=> string(0) "" [25]=> string(0) "" [26]=> string(0) "" [27]=> string(0) "" [28]=> string(0) "" [29]=> string(0) "" [30]=> string(0) "" [31]=> string(0) "" [32]=> string(0) "" [33]=> string(0) "" [34]=> string(0) "" [35]=> string(0) "" [36]=> string(0) "" [37]=> string(0) "" [38]=> string(0) "" [39]=> string(0) "" [40]=> string(0) "" [41]=> string(0) "" [42]=> string(0) "" [43]=> string(0) "" [44]=> string(0) "" [45]=> string(0) "" [46]=> string(0) "" [47]=> string(0) "" [48]=> string(0) "" [49]=> string(0) "" [50]=> string(0) "" [51]=> string(0) "" [52]=> string(0) "" [53]=> string(0) "" [54]=> string(0) "" [55]=> string(0) "" [56]=> string(0) "" [57]=> string(0) "" [58]=> string(0) "" [59]=> string(0) "" [60]=> string(0) "" [61]=> string(0) "" }
Кто не рискует - тот не пьёт шампанского.

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

[PHP] Помогите распарсить строку в массив

Непрочитанное сообщение FreeBSP » 2015-02-25 21:36:27

Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

Аватара пользователя
Духовитин
мл. сержант
Сообщения: 125
Зарегистрирован: 2014-12-17 8:46:05

[PHP] Помогите распарсить строку в массив

Непрочитанное сообщение Духовитин » 2015-02-26 7:57:48

FreeBSP за ссылки спасибо, но у меня целый скачанный с php.net мануал есть. Там и про регулярные выражения тоже глава имеется.
Тут написал в надежде, что те кто умеют регулярки, помогут не предложением самому выучить (хотя предложение дельное), а в надежде что дадут работающий пример для конкретно указанного случая.
Кто не рискует - тот не пьёт шампанского.

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

[PHP] Помогите распарсить строку в массив

Непрочитанное сообщение FreeBSP » 2015-02-26 20:40:55

я тыкнул не на весь необъемный ман, а на конкретные вещи где косяки

а именно: надо заменить | на \|
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

Аватара пользователя
Духовитин
мл. сержант
Сообщения: 125
Зарегистрирован: 2014-12-17 8:46:05

[PHP] Помогите распарсить строку в массив

Непрочитанное сообщение Духовитин » 2015-02-26 21:00:28

FreeBSP спасибо!

Всё в точности как надо. Сейчас проведу замеры скорости варианта с регулярками и с обычным explode'ным способом, тут отпишусь для информации.
А то в мануале про функции парсинга регулярками написано что они мощные но типа более медленные чем простые функции типа explode.

Спасибо ещё раз за помощь!
Кто не рискует - тот не пьёт шампанского.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35454
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

[PHP] Помогите распарсить строку в массив

Непрочитанное сообщение Alex Keda » 2015-02-28 15:58:19

вам мильён строк чтоле распарсить надо?
если нет - я б даже и не чесался...
Убей их всех! Бог потом рассортирует...

Аватара пользователя
Духовитин
мл. сержант
Сообщения: 125
Зарегистрирован: 2014-12-17 8:46:05

[PHP] Помогите распарсить строку в массив

Непрочитанное сообщение Духовитин » 2015-03-01 20:31:12

Нет, у меня это для парсинга шаблонов. А их мильён не мильён, но если можно использовать вариант в одну строчку или вариант в две строчки, то вроде дел-то немного, а микрооптимизация лишней не будет.

Проект хоть и в стадии создания, но делаю для использования, а там кто знает какие масштабы будут :)

В php мануале с комментариями от пользователей просто несколько раз видел, по разным функциям есть чувак который выдаёт, что вот это если делать так, то такое время, если через массив то так, если ещё эдак то вот. Считаю полезно иметь такую информацию :)

Как говорится: "Копейка рубль бережёт"
Кто не рискует - тот не пьёт шампанского.

Гость
проходил мимо

[PHP] Помогите распарсить строку в массив

Непрочитанное сообщение Гость » 2016-04-05 21:15:27

Код: Выделить всё

$data = "<---|KEY_1|--->
Содержимое ключа 1
<---END--->
<---|FIELD_3|--->
Содержимое другого ключа
<---END--->";

$result = [];

foreach(explode('<---END--->', $data) as $content) {
    $content = trim($content);
    if ( $content ) {
        list($key, $content) = explode("\n", $content, 2);
        list(, $key) = explode("|", $key);
        $result[$key] = trim($content);
    }
}

print_r($result);

Код: Выделить всё

Array
(
    [KEY_1] => Содержимое ключа 1
    [FIELD_3] => Содержимое другого ключа
)