Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 03.03.2013
Сообщений: 27

Корректно обработать строку и получить значение

18.09.2016, 20:02. Показов 754. Ответов 7

Студворк — интернет-сервис помощи студентам
Доброго времени суток,
Замучался решать задачу.

Необходимо обработать строку:
{hook-contact id="220" sale="Новое направление"}

Распределить по полочкам значения. В итоге нужно получить примерно такое:

PHP
1
2
3
4
5
$arr = array(
"hook" => "contact",
"id" => "220",
"sale" => "Новое направление"
);
Вся проблема в том, что строка может содержать разные данные, но в одном формате, типа:
{hook-sale price="500" name="Одежда и обувь"}
{hook-phone number="495555555"}

Я пытался делать через explode. Но он дробит вообще всю строку, где есть пробелы. Возможно ли вообще обработать такое?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.09.2016, 20:02
Ответы с готовыми решениями:

Как правильно обработать строку с запятыми?
После кодирования, например, $pic='облачно, дождь'; $pic2='2'; json_encode(array((string)$pic, (intval)$pic2)); раскодируется...

Получить значение из DBEdit и обработать его
Доброго времени суток, уважаемые форумчане! Возник такой вопрос: можно ли (если - да, то как?) извлечь значение из компонента DBEdit и...

Как корректно обработать эту ошибку.
Иногда выскакивает эта ошибка. Я немогу ее никак обработать, понять где именно она выскакивает. Нашел в msdn следующее. Из сообщения как...

7
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
18.09.2016, 20:35
Цитата Сообщение от gooex Посмотреть сообщение
Возможно ли вообще обработать такое?
как вариант - преобразовать в xml
PHP
1
2
3
4
5
6
7
<?php
 
$str = '{hook-contact id="220" sale="Новое направление"}';
$str[0] = '<';
$str[strlen($str)-1] = '/';
$xml = new SimpleXMLElement("<i>{$str}></i>");
var_dump($xml);
http://ideone.com/Pv2PIZ

Не по теме:

Да, я извращенец :D



Добавлено через 11 минут
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
 
$str_list = [
    '{hook-contact id="220" sale="Новое направление"}',
    '{hook-phone number="495555555"}',
];
function toXML($str) {
    $str = trim($str);
    $str = ltrim($str, '{');
    $str = rtrim($str, '}');
    return new SimpleXMLElement("<i><{$str}/></i>");
}
$xml_list = array_map('toXML', $str_list);
var_dump($xml_list);
так вот получше будет http://ideone.com/MF11f5
выхлоп:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
array(2) {
  [0]=>
  object(SimpleXMLElement)#1 (1) {
    ["hook-contact"]=>
    object(SimpleXMLElement)#3 (1) {
      ["@attributes"]=>
      array(2) {
        ["id"]=>
        string(3) "220"
        ["sale"]=>
        string(33) "Новое направление"
      }
    }
  }
  [1]=>
  object(SimpleXMLElement)#2 (1) {
    ["hook-phone"]=>
    object(SimpleXMLElement)#3 (1) {
      ["@attributes"]=>
      array(1) {
        ["number"]=>
        string(9) "495555555"
      }
    }
  }
}
0
0 / 0 / 0
Регистрация: 03.03.2013
Сообщений: 27
18.09.2016, 21:42  [ТС]
Интересное решение.
А что если представить эти строки по-другому формату, например:
{hook="sale" price="500" name="Одежда и обувь"}
{hook="phone" number="495555555"}

Пытался сделать регуляркой:
PHP
1
preg_match_all("|{hook=\"(.*)\".+\"(.*)\"+}|ui", $text, $out, PREG_PATTERN_ORDER);
Но результат не совсем такой
0
276 / 201 / 143
Регистрация: 22.01.2016
Сообщений: 637
19.09.2016, 01:32
gooex,
PHP
1
2
3
4
5
6
7
$text = '{hook="sale" price="500" name="Одежда и обувь"}';
preg_match_all("~([^{\s=]*)=\"([^\"]*)\"~", $text, $m);
$result = [];
for ($i = 0; $i < count($m[1]); $i++) {
    $result[$m[1][$i]] = $m[2][$i];
}
print_r($result);
1
Фрилансер
Эксперт PythonЭксперт JSЭксперт PHP
 Аватар для Azdeman
1871 / 1362 / 604
Регистрация: 12.01.2011
Сообщений: 5,470
19.09.2016, 03:15
Цитата Сообщение от mrNTF Посмотреть сообщение
$i < count($m[1]);
Для производительности лучше так не делать. А просчитывать элементы перед циклом.

PHP
1
2
3
4
$cnt = count($m[1]);
for ($i = 0; $i < $cnt ; $i++) {
    $result[$m[1][$i]] = $m[2][$i];
}
1
1137 / 685 / 412
Регистрация: 07.11.2015
Сообщений: 1,102
19.09.2016, 05:18
Есть такая штука (?|...) сброс нумерации в ветвлении. Это позволяет назначить один номер разным сохраняющим скобкам.
Удобно сразу собрать все ключи и значения.
PHP
1
2
3
4
5
6
$str = '{hook-contact id="220" sale="Новое направление"}';
 
preg_match_all('@(\w+)(?|-(\w+)|="([^"]+)")@', $str, $m);
$r = array_combine($m[1], $m[2]);
 
echo '$arr = ', var_export($r, true), ';';
1
0 / 0 / 0
Регистрация: 03.03.2013
Сообщений: 27
19.09.2016, 10:58  [ТС]
Это просто гениально!
Все работает.

Только как дополнить регулярку, чтобы она собирала только фигурные скобочки с первым словом hook {hook=*} ?
Иначе она собирает любые слова типа foo="bar"
0
18 / 17 / 2
Регистрация: 11.01.2013
Сообщений: 109
19.09.2016, 11:39
Цитата Сообщение от gooex Посмотреть сообщение
Только как дополнить регулярку, чтобы она собирала только фигурные скобочки с первым словом hook {hook=*} ?
Иначе она собирает любые слова типа foo="bar"
Формат строки сами творите или это со стороннего источника нужно парсить данные? Если сами, то приводите к стандарту json-объекта и не нужно никаких регулярок и прочего изврата.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.09.2016, 11:39
Помогаю со студенческими работами здесь

Как корректно обработать конец файла?
  Исходная задача: реализовать шифр Цезаря.   Столкнулся с проблемой. Когда указатель в файле доходит до последнего символа в файле...

Как получить строку, а не значение?
Добрый день! В прошлой теме мне подсказал код Para bellum, спасибо большое ему за это. Вот только возник еще один вопрос. SELECT...

Как получить значение указателя на строку?
VB6 : Не подскажите API возвращает указатель на строку, как получить значение

Получить значение переменной, используя в качестве оператора строку
Добрый день! Есть переменная &quot;Элемент&quot; которая содержит много разных свойств(Возможно неправильный термин) Элемент.рейс = 524,...

Как распарсить строку JSON и получить оттуда только одно значение?
Сервер возвращает мне длинную JSON строку. Из нее мне нужно вытащить только ID. Я сделал так: public class IDResponse { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru