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

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
p33t
Отправлено: 20 Августа, 2016 - 02:27:34
Post Id


Новичок


Покинул форум
Сообщений всего: 40
Дата рег-ции: Окт. 2014  


Помог: 0 раз(а)




Всем привет.
Такая ситуация.

Делаю клиент сервиса, который сбегает на сайт банка и принесет строку с данными.
Строка - есть.
Далее с помошью pregmatch выбрать нужное.
Но как ни старался, vardump возвращает пустой массив. Значит - не нашло.
Но я пробовал скопировать строку в документ и на месте провести все операции.
И этот способ сработал. Значит - шаблон работает нормально.
Но когда ищу нужную мне строку в строке которая возвращается с сервера сервиса, функция pregmatch не находит сходств.

В чем может быть проблемма. ???

Заранее спасибо за внимание.
 
 Top
Мелкий Супермодератор
Отправлено: 20 Августа, 2016 - 10:10:30
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Что делать, что делать. Проверять, что вам вернулось. В тяжёлых случаях - до каждого байта. Затем править регулярку с этим знанием.


-----
PostgreSQL DBA
 
 Top
p33t
Отправлено: 20 Августа, 2016 - 16:03:22
Post Id


Новичок


Покинул форум
Сообщений всего: 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
Однако
(Добавление)
Кстати, большое спасибо за отклик.
А каким способом еще можно побайтово проверить сопоставимые строки ??? Растерялся
 
 Top
Мелкий Супермодератор
Отправлено: 20 Августа, 2016 - 16:31:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




p33t пишет:
Патэрн остается в ASCII.

Значит в паттерне вы используете только ASCII-символы.
UTF8 и огромная куча других кодировок являются надмножеством ASCII. Если в строке используются символы только из ASCII - то все эти кодировки будут бинарно идентичны.

p33t пишет:
А каким способом еще можно побайтово проверить сопоставимые строки ???

Вывести на stdout и скормить в hd.
Или сдампить в файлик и посмотреть любым hex редактором.

p33t пишет:
Вот кусок строки в которой ищу:

Ну уж вряд ли этот кусок записан вот так без какого-либо разделителя. Вот отчего мне кажется, что это кусок xml?..


-----
PostgreSQL DBA
 
 Top
Строитель Модератор
Отправлено: 20 Августа, 2016 - 17:17:32
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




p33t пишет:
нужно выбрать цифры перед строкой USD - то есть: 120051.00840
Добавил к вашему шаблону два модификатора u - что говорит об использовании юникода, и i - что говорит о не чувствительности к регисту
PHP:
скопировать код в буфер обмена
  1. $search = 'Доллар США120051.00840USDЕвро122271.009 78EURЗлотый15010.43985PLN';
  2.  
  3. preg_match('~(\d+\.\d+)USD~ui', $search, $matches);
  4.  
  5. echo $matches[1];//120051.00840
 
 Top
p33t
Отправлено: 20 Августа, 2016 - 22:26:08
Post Id


Новичок


Покинул форум
Сообщений всего: 40
Дата рег-ции: Окт. 2014  


Помог: 0 раз(а)




Народ, я вам безгранично благодарен. Радость
Спасибо вам Мелкий за столь развернутый ответ по кодировке.

Еще большая просьба, можно было бы поподробнее, как это
"Вывести на stdout и скормить в hd."

А "сдампить в файлик и посмотреть любым hex редактором." это вы имели ввиду сохранить просто через fwrite или что то в этом роде ???

И что такое hex редактор ???
Я пользуюсь sublime3 редактором.

Просто много чего нового от вас узнаю...
(Добавление)
Строитель, скажите, а "~" это тоже часть патерна ?
(Добавление)
Аааа, и чуть не забыл.
Мелкий пишет:
p33t пишет:
Вот кусок строки в которой ищу:

Ну уж вряд ли этот кусок записан вот так без какого-либо разделителя. Вот отчего мне кажется, что это кусок xml?..



Строка ничем не разделяется и это не xml, а простая строка Радость
Сам был удивлен когда такое учидел.

Просто на сколько я понял, soap уже почти не используется. А как на банковском сайте было написано, "Данная технология является устаревшей. Ее дальнейшее развитие не планируется. Рекомендуем использовать API. "

Это значит, что у них есть для этих целей свой API ?
(Добавление)
Простите за глупый вопрос про "~" Закатив глазки
 
 Top
Строитель Модератор
Отправлено: 20 Августа, 2016 - 22:49:04
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




p33t пишет:
Строитель, скажите, а "~" это тоже часть патерна ?
"~" - это ограничитель шаблона. В вашем коде ограничителем является прямой слеш "/", и это тоже правильно и будет работать. Лично мне удобнее использовать знак "Ти́льда", потому что при наличии внутри шаблона прямых слэшей, их не придётся экранировать обратными.
 
 Top
Мелкий Супермодератор
Отправлено: 20 Августа, 2016 - 22:50:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




p33t пишет:
Еще большая просьба, можно было бы поподробнее, как это
"Вывести на stdout и скормить в hd."

Вот так вот:
CODE (bash):
скопировать код в буфер обмена
  1. melkij@melkij:~$ cat test.php
  2. <?php
  3. $somestring = 'Hello';
  4. echo $somestring;
  5. melkij@melkij:~$ php test.php | hd
  6. 00000000  48 65 6c 6c 6f                                    |Hello|
  7. 00000005
  8. melkij@melkij:~$

И сразу видно, что ничего лишнего в выводе скрипта нет.

В файлик - да, любой бинарно-безопасный метод записи. file_put_contents, fwrite
hex редактор - 16-ричный редактор. Мне не приходилось именно редактировать, а для просмотра hd хватает.

p33t пишет:
"~" это тоже часть патерна ?

Delimiter, у вас используется /, можно использовать любой другой спецсимвол, http://php.net/manual/en/regexp....e.delimiters.php

p33t пишет:
Это значит, что у них есть для этих целей свой API ?

Может быть. Фраза так построена, будто api есть. Но его в то же самое время может и не быть. Бывает такое...


-----
PostgreSQL DBA
 
 Top
p33t
Отправлено: 20 Августа, 2016 - 23:14:02
Post Id


Новичок


Покинул форум
Сообщений всего: 40
Дата рег-ции: Окт. 2014  


Помог: 0 раз(а)




Строитель, спасибо, я уже понял по делимитеру.
Просто немножко ступил... Однако
(Добавление)
Мелкий, судя по вашему коду, я догадываюсь, что вы используете что то вроде командной строки....???
Правильны ли мои предположения ?
Мелкий пишет:
melkij@melkij:~$ cat test.php
<?php
$somestring = 'Hello';
echo $somestring;
melkij@melkij:~$ php test.php | hd
00000000 48 65 6c 6c 6f |Hello|
00000005
melkij@melkij:~$


Если честно, мне код что вы написали, мало о чем говорит.
Вот только догадываюсь....
А по stdin stdout stderr, в мануале почитал, что к ним тоже можно обращаться как к файлам.
 
 Top
p33t
Отправлено: 21 Августа, 2016 - 22:28:18
Post Id


Новичок


Покинул форум
Сообщений всего: 40
Дата рег-ции: Окт. 2014  


Помог: 0 раз(а)




Что я сделал, это скопировал из браузера строку которую возвращает сервкр банка и
положил ее в переменную ($ha).
Затем взял строку которую возвращает банк и тож поместил ее в переменную ($hb)
После чего, обе строки скормил для bin2hex() функции и сравнил результаты.
Строки вообще не схрдятся даже по длине Не понял

ЧТО ЭТО ЗНАЧИТ !!!???
(Добавление)
Блин, а что делать если hex у строк разный ???
Как их можно сравнить ???
И почиму он разный ?
(Добавление)
Все, разобрался.... Радость

Немного ступил и вас господа завел в заблуждение.

Возвращаемый код был в xml формате Закатив глазки

Но благодаря этому, я перерыл весь нет несколько раз и много чего усвоил.

Единственный вопрос для Мелкого пользователя:
Я так и не понял что это за утилитка hd и где ее можно найти ???
 
 Top
Мелкий Супермодератор
Отправлено: 22 Августа, 2016 - 08:43:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




p33t пишет:
вы используете что то вроде командной строки....???

Да, стандартный /bin/bash

p33t пишет:
утилитка hd и где ее можно найти ???

Озадачился, всегда была такая.
Это из bsdmainutils, оказывается. hd - симлинк на hexdump


-----
PostgreSQL DBA
 
 Top
p33t
Отправлено: 22 Августа, 2016 - 16:14:33
Post Id


Новичок


Покинул форум
Сообщений всего: 40
Дата рег-ции: Окт. 2014  


Помог: 0 раз(а)




Мелкий пишет:
p33t пишет:
вы используете что то вроде командной строки....???

Да, стандартный /bin/bash


У вас Mak и bash это стандартная командная строка ???
Если так, то у windows cmd такой утилитки как hexDump нету.

Я просто на windows и для этих целей использовал стандартный command prompt

Подтвердите, прав ли я в своих предположениях.

Заранее спасибо
 
 Top
Мелкий Супермодератор
Отправлено: 22 Августа, 2016 - 18:14:23
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Лично у меня linux, debian. А bash портирован много куда.
По виндам не подскажу.


-----
PostgreSQL DBA
 
 Top
p33t
Отправлено: 22 Августа, 2016 - 21:02:51
Post Id


Новичок


Покинул форум
Сообщений всего: 40
Дата рег-ции: Окт. 2014  


Помог: 0 раз(а)




ну вот теперь все стало понятно Улыбка

Мелкий, спасибо вам огромное за помощ.
Очинь благодарен за уделенное вами время.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB