Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Не работает правильный шаблон regexp
Покинул форум
Сообщений всего: 40
Дата рег-ции: Окт. 2014
Помог: 0 раз(а)
Всем привет.
Такая ситуация.
Делаю клиент сервиса, который сбегает на сайт банка и принесет строку с данными.
Строка - есть.
Далее с помошью pregmatch выбрать нужное.
Но как ни старался, vardump возвращает пустой массив. Значит - не нашло.
Но я пробовал скопировать строку в документ и на месте провести все операции.
И этот способ сработал. Значит - шаблон работает нормально.
Но когда ищу нужную мне строку в строке которая возвращается с сервера сервиса, функция pregmatch не находит сходств.
В чем может быть проблемма. ???
Заранее спасибо за внимание.
Мелкий
Отправлено: 20 Августа, 2016 - 10:10:30
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Что делать, что делать. Проверять, что вам вернулось. В тяжёлых случаях - до каждого байта. Затем править регулярку с этим знанием.
----- PostgreSQL DBA
p33t
Отправлено: 20 Августа, 2016 - 16:03:22
Новичок
Покинул форум
Сообщений всего: 40
Дата рег-ции: Окт. 2014
Помог: 0 раз(а)
Как я только не проверял....
В принципе, сам шаблон скорее всего ошибок не содержит.
Но сверил кодировку строки в крторой производится поиск и кодировку переменной в которой находится сам патэрн. И вот что у меня вышло:
Строка - UTF-8
Патэрн- ASCII
Возможно тут и зарыта псина.
Но пробовал изменить кодировку всего документа (через header('content-type...))
Ничего !!!
Патэрн остается в ASCII.
Так же пробовал функциями mb_convert_encoding и mb_internal_encoding поменять кодировку строки и документа в целом.
Но все равно кодировка патерна остается той же.
Что не так ????
Вот кусок строки в которой ищу:
Доллар США120051.00840USDЕвро122271.009 78EURЗлотый15010.43985PLN
а вот сам патерн: "/(\d+\.\d+)USD/"
А нужно выбрать цифры перед строкой USD - то есть: 120051.00840
(Добавление)
Кстати, большое спасибо за отклик.
А каким способом еще можно побайтово проверить сопоставимые строки ???
Мелкий
Отправлено: 20 Августа, 2016 - 16:31:13
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
p33t пишет:
Патэрн остается в ASCII.
Значит в паттерне вы используете только ASCII-символы.
UTF8 и огромная куча других кодировок являются надмножеством ASCII. Если в строке используются символы только из ASCII - то все эти кодировки будут бинарно идентичны.
p33t пишет:
А каким способом еще можно побайтово проверить сопоставимые строки ???
Вывести на stdout и скормить в hd.
Или сдампить в файлик и посмотреть любым hex редактором.
p33t пишет:
Вот кусок строки в которой ищу:
Ну уж вряд ли этот кусок записан вот так без какого-либо разделителя. Вот отчего мне кажется, что это кусок xml?..
----- PostgreSQL DBA
Строитель
Отправлено: 20 Августа, 2016 - 17:17:32
Участник
Покинул форум
Сообщений всего: 1581
Дата рег-ции: Февр. 2014 Откуда: Украина
Помог: 74 раз(а)
p33t пишет:
нужно выбрать цифры перед строкой USD - то есть: 120051.00840
Добавил к вашему шаблону два модификатора u - что говорит об использовании юникода, и i - что говорит о не чувствительности к регисту
Покинул форум
Сообщений всего: 40
Дата рег-ции: Окт. 2014
Помог: 0 раз(а)
Народ, я вам безгранично благодарен.
Спасибо вам Мелкий за столь развернутый ответ по кодировке.
Еще большая просьба, можно было бы поподробнее, как это
"Вывести на stdout и скормить в hd."
А "сдампить в файлик и посмотреть любым hex редактором." это вы имели ввиду сохранить просто через fwrite или что то в этом роде ???
И что такое hex редактор ???
Я пользуюсь sublime3 редактором.
Просто много чего нового от вас узнаю... (Добавление)
Строитель, скажите, а "~" это тоже часть патерна ? (Добавление)
Аааа, и чуть не забыл.
Мелкий пишет:
p33t пишет:
Вот кусок строки в которой ищу:
Ну уж вряд ли этот кусок записан вот так без какого-либо разделителя. Вот отчего мне кажется, что это кусок xml?..
Строка ничем не разделяется и это не xml, а простая строка
Сам был удивлен когда такое учидел.
Просто на сколько я понял, soap уже почти не используется. А как на банковском сайте было написано, "Данная технология является устаревшей. Ее дальнейшее развитие не планируется. Рекомендуем использовать API. "
Это значит, что у них есть для этих целей свой API ? (Добавление)
Простите за глупый вопрос про "~"
Строитель
Отправлено: 20 Августа, 2016 - 22:49:04
Участник
Покинул форум
Сообщений всего: 1581
Дата рег-ции: Февр. 2014 Откуда: Украина
Помог: 74 раз(а)
p33t пишет:
Строитель, скажите, а "~" это тоже часть патерна ?
"~" - это ограничитель шаблона. В вашем коде ограничителем является прямой слеш "/", и это тоже правильно и будет работать. Лично мне удобнее использовать знак "Ти́льда", потому что при наличии внутри шаблона прямых слэшей, их не придётся экранировать обратными.
Мелкий
Отправлено: 20 Августа, 2016 - 22:50:47
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
p33t пишет:
Еще большая просьба, можно было бы поподробнее, как это
"Вывести на stdout и скормить в hd."
И сразу видно, что ничего лишнего в выводе скрипта нет.
В файлик - да, любой бинарно-безопасный метод записи. file_put_contents, fwrite
hex редактор - 16-ричный редактор. Мне не приходилось именно редактировать, а для просмотра hd хватает.
Это значит, что у них есть для этих целей свой API ?
Может быть. Фраза так построена, будто api есть. Но его в то же самое время может и не быть. Бывает такое...
----- PostgreSQL DBA
p33t
Отправлено: 20 Августа, 2016 - 23:14:02
Новичок
Покинул форум
Сообщений всего: 40
Дата рег-ции: Окт. 2014
Помог: 0 раз(а)
Строитель, спасибо, я уже понял по делимитеру.
Просто немножко ступил... (Добавление)
Мелкий, судя по вашему коду, я догадываюсь, что вы используете что то вроде командной строки....???
Правильны ли мои предположения ?
Если честно, мне код что вы написали, мало о чем говорит.
Вот только догадываюсь....
А по stdin stdout stderr, в мануале почитал, что к ним тоже можно обращаться как к файлам.
p33t
Отправлено: 21 Августа, 2016 - 22:28:18
Новичок
Покинул форум
Сообщений всего: 40
Дата рег-ции: Окт. 2014
Помог: 0 раз(а)
Что я сделал, это скопировал из браузера строку которую возвращает сервкр банка и
положил ее в переменную ($ha).
Затем взял строку которую возвращает банк и тож поместил ее в переменную ($hb)
После чего, обе строки скормил для bin2hex() функции и сравнил результаты.
Строки вообще не схрдятся даже по длине
ЧТО ЭТО ЗНАЧИТ !!!??? (Добавление)
Блин, а что делать если hex у строк разный ???
Как их можно сравнить ???
И почиму он разный ? (Добавление)
Все, разобрался....
Немного ступил и вас господа завел в заблуждение.
Возвращаемый код был в xml формате
Но благодаря этому, я перерыл весь нет несколько раз и много чего усвоил.
Единственный вопрос для Мелкого пользователя:
Я так и не понял что это за утилитка hd и где ее можно найти ???
Мелкий
Отправлено: 22 Августа, 2016 - 08:43:48
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
p33t пишет:
вы используете что то вроде командной строки....???
Да, стандартный /bin/bash
p33t пишет:
утилитка hd и где ее можно найти ???
Озадачился, всегда была такая.
Это из bsdmainutils, оказывается. hd - симлинк на hexdump
----- PostgreSQL DBA
p33t
Отправлено: 22 Августа, 2016 - 16:14:33
Новичок
Покинул форум
Сообщений всего: 40
Дата рег-ции: Окт. 2014
Помог: 0 раз(а)
Мелкий пишет:
p33t пишет:
вы используете что то вроде командной строки....???
Да, стандартный /bin/bash
У вас Mak и bash это стандартная командная строка ???
Если так, то у windows cmd такой утилитки как hexDump нету.
Я просто на windows и для этих целей использовал стандартный command prompt
Подтвердите, прав ли я в своих предположениях.
Заранее спасибо
Мелкий
Отправлено: 22 Августа, 2016 - 18:14:23
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Лично у меня linux, debian. А bash портирован много куда.
По виндам не подскажу.
----- PostgreSQL DBA
p33t
Отправлено: 22 Августа, 2016 - 21:02:51
Новичок
Покинул форум
Сообщений всего: 40
Дата рег-ции: Окт. 2014
Помог: 0 раз(а)
ну вот теперь все стало понятно
Мелкий, спасибо вам огромное за помощ.
Очинь благодарен за уделенное вами время.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.