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 :: Регулярное выражение странно себя ведёт

 PHP.SU

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


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

> Без описания
M1ke
Отправлено: 30 Июля, 2016 - 08:03:08
Post Id


Новичок


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


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




В общем есть регулярка:
CODE (htmlphp):
скопировать код в буфер обмена
  1. /(?P<count>[0-9]+)(| )(?P<currency>руб|\$|&#8372;)/i

Используя preg_match, пытаюсь получать цену и валюту из строки

Вот с такой строки:
Цитата:
разработка проекта, bootstrap, yii2 (Бюджет: 250 руб.)

Спокойно вытащил и цену, и валюту. А со следующей:
Цитата:
Скопировать Лэндинг с некоторыми изменениями (Бюджет: 1000 руб.)

Вообще ничего.

В чем может быть причина? Уже очень долго мучаюсь с этой проблемой
 
 Top
Fart
Отправлено: 30 Июля, 2016 - 09:41:52
Post Id



Посетитель


Покинул форум
Сообщений всего: 324
Дата рег-ции: Июль 2016  


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




попробуй свою задумку сделать так:
PHP:
скопировать код в буфер обмена
  1. /:\s(?P<count>[0-9]+)\s(?P<currency>руб|\$|&#8372;)/i
  2. //или для более точного нахождения
  3. /Бюджет:\s(?P<count>[0-9]+)\s(?P<currency>руб|\$|&#8372;)/i


var_dump покажет следующее. тут, я думаю, сам увидишь, что тебе нужно

CODE (htmlphp):
скопировать код в буфер обмена
  1. array(5) {
  2.   [0]=>
  3.   string(13) ": 250 &#8372;"
  4.   ["count"]=>
  5.   string(3) "250"
  6.   [1]=>
  7.   string(3) "250"
  8.   ["currency"]=>
  9.   string(7) "&#8372;"
  10.   [2]=>
  11.   string(7) "&#8372;"
  12. }

(Отредактировано автором: 30 Июля, 2016 - 09:44:10)

 
 Top
M1ke
Отправлено: 30 Июля, 2016 - 09:56:15
Post Id


Новичок


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


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




Fart пишет:
попробуй свою задумку сделать так:
PHP:
скопировать код в буфер обмена
  1. /:\s(?P<count>[0-9]+)\s(?P<currency>руб|\$|&#8372;)/i
  2. //или для более точного нахождения
  3. /Бюджет:\s(?P<count>[0-9]+)\s(?P<currency>руб|\$|&#8372;)/i



Спасибо за ответ, да вот только он пропустил эту строку:
Цитата:
Отзыв на Яндекс.Маркет (Бюджет: 70 руб.)


Контекст вызова (если что):
CODE (htmlphp):
скопировать код в буфер обмена
  1. preg_match('/:\s(?P<count>[0-9]+)\s(?P<currency>руб|\$|&#8372;)/i', $title, $matches); 

(Отредактировано автором: 30 Июля, 2016 - 09:56:51)

 
 Top
Fart
Отправлено: 30 Июля, 2016 - 09:58:53
Post Id



Посетитель


Покинул форум
Сообщений всего: 324
Дата рег-ции: Июль 2016  


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




у меня с той же регуляркой и твоим текстом показывает вар дамп:
CODE (htmlphp):
скопировать код в буфер обмена
  1. array(5) {
  2.   [0]=>
  3.   string(23) "Бюджет: 70 руб"
  4.   ["count"]=>
  5.   string(2) "70"
  6.   [1]=>
  7.   string(2) "70"
  8.   ["currency"]=>
  9.   string(6) "руб"
  10.   [2]=>
  11.   string(6) "руб"
  12. }


PS ничего не менял только подставил твой текст

вот весь код:
PHP:
скопировать код в буфер обмена
  1. $t1 = "Отзыв на Яндекс.Маркет (Бюджет: 70 руб.)";
  2. $t2 = "Скопировать Лэндинг с некоторыми изменениями (Бюджет: 1000 руб.)";
  3. $t3 = "разработка проекта, bootstrap, yii2 (Бюджет: 250 руб.)";
  4. preg_match("/Бюджет:\s(?P<count>[0-9]+)\s(?P<currency>руб|\$|&#8372;)/i", $t1, $a1);
  5. var_dump($a1);
  6. preg_match("/Бюджет:\s(?P<count>[0-9]+)\s(?P<currency>руб|\$|&#8372;)/i", $t2, $a2);
  7. var_dump($a2);
  8. preg_match("/Бюджет:\s(?P<count>[0-9]+)\s(?P<currency>руб|\$|&#8372;)/i", $t3, $a3);
  9. var_dump($a3);

(Отредактировано автором: 30 Июля, 2016 - 10:05:34)

 
 Top
M1ke
Отправлено: 30 Июля, 2016 - 10:03:00
Post Id


Новичок


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


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




Fart пишет:
у меня с той же регуляркой и твоим текстом показывает вар дамп:


Странно. Возможно, проблема тогда в методе класса, который это делает?

CODE (htmlphp):
скопировать код в буфер обмена
  1.                 public static function getBudget($title, $desc = '')
  2.                 {
  3.                         $matches = [];
  4.                
  5.                         preg_match('/:\s(?P<count>[0-9]+)\s(?P<currency>руб|\$|&#8372;)/i', $title, $matches); 
  6.                         if(!count($matches)) {
  7.                                 preg_match('/:\s(?P<count>[0-9]+)\s(?P<currency>руб|\$|&#8372;)/i', $desc, $matches);
  8.                         }
  9.  
  10.                         return $matches;
  11.                 }


К слову, с описания вытаскивает нормально даже при старой регулярке

(Отредактировано автором: 30 Июля, 2016 - 10:03:26)

 
 Top
Fart
Отправлено: 30 Июля, 2016 - 10:07:23
Post Id



Посетитель


Покинул форум
Сообщений всего: 324
Дата рег-ции: Июль 2016  


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




PHP:
скопировать код в буфер обмена
  1. $arr = [
  2. "Отзыв на Яндекс.Маркет (Бюджет: 70 руб.)",
  3. "Скопировать Лэндинг с некоторыми изменениями (Бюджет: 1000 руб.)",
  4. "разработка проекта, bootstrap, yii2 (Бюджет: 250 руб.)"
  5. ];
  6.  
  7. class test
  8. {
  9.         public static function getBudget($title, $desc = '')
  10.         {
  11.                 preg_match('/Бюджет:\s(?P<count>[0-9]+)\s(?P<currency>руб|\$|&#8372;)/i', $title, $matches);
  12.                 if(count($matches)<5)
  13.                         return "error";
  14.                 else
  15.                         return $matches;
  16.         }
  17. }
  18.  
  19. $obj = new test();
  20. for($i=0; $i<count($arr); $i++)
  21. {
  22.         var_dump($obj->getBudget($arr[$i]));
  23. }
  24. /*
  25. array(5) {
  26.   [0]=>
  27.   string(23) "Бюджет: 70 руб"
  28.   ["count"]=>
  29.   string(2) "70"
  30.   [1]=>
  31.   string(2) "70"
  32.   ["currency"]=>
  33.   string(6) "руб"
  34.   [2]=>
  35.   string(6) "руб"
  36. }
  37. array(5) {
  38.   [0]=>
  39.   string(25) "Бюджет: 1000 руб"
  40.   ["count"]=>
  41.   string(4) "1000"
  42.   [1]=>
  43.   string(4) "1000"
  44.   ["currency"]=>
  45.   string(6) "руб"
  46.   [2]=>
  47.   string(6) "руб"
  48. }
  49. array(5) {
  50.   [0]=>
  51.   string(24) "Бюджет: 250 руб"
  52.   ["count"]=>
  53.   string(3) "250"
  54.   [1]=>
  55.   string(3) "250"
  56.   ["currency"]=>
  57.   string(6) "руб"
  58.   [2]=>
  59.   string(6) "руб"
  60. }
  61. */
  62.  
  63.  

(Добавление)
$desc = '' - не нужен в моем примере... какие цели ты преследуешь, то тогда оставляй

(Отредактировано автором: 30 Июля, 2016 - 10:15:41)

 
 Top
M1ke
Отправлено: 31 Июля, 2016 - 01:00:36
Post Id


Новичок


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


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




Fart, благодарю за уделённое время. Проблема вообще оказалась не в том месте
 
 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