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]   

> Без описания
Itan
Отправлено: 22 Сентября, 2016 - 19:48:20
Post Id


Частый гость


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


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




Убил три часа не могу додуматься.
Есть строка:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2.                         <a class="au-elements__title__link_table"
  3.                            href="/car/used/vaz/2121/8139254"
  4.                            title="">
  5.                             ВАЗ (LADA)
  6.                             2121 Нива
  7.                         </a>
  8.  

- с табуляциями и пробелами.
Надо вытащить числовой индекс 2121.

Последняя стряпня (сильно не смейтесь):
PHP:
скопировать код в буфер обмена
  1. preg_match('~ВАЗ \(LADA\).*([0-9]+)~Uis', $s, $model);


Не работает оно. Помогите, пожалуйста.

(Отредактировано автором: 22 Сентября, 2016 - 19:51:01)

 
 Top
Строитель Модератор
Отправлено: 22 Сентября, 2016 - 19:58:20
Post Id



Участник


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


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




Itan, откуда именно надо вытащить, отсюда href="/car/used/vaz/2121/8139254" ?
(Добавление)
Или отсюда ВАЗ (LADA)
2121 Нива
?
 
 Top
Fart
Отправлено: 22 Сентября, 2016 - 20:24:17
Post Id



Посетитель


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


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




из строчки (учитывает пробелы, табы, новые строчки):

>\W*\S*\W*(\d+)\W*<\/a>

(Отредактировано автором: 22 Сентября, 2016 - 20:24:38)

 
 Top
Itan
Отправлено: 23 Сентября, 2016 - 11:42:22
Post Id


Частый гость


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


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




Огромное спасибо!
 
 Top
Itan
Отправлено: 25 Сентября, 2016 - 09:27:56
Post Id


Частый гость


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


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




Друзья! Снова обращаюсь за помощью!

В процессе эксплуатации выяснилось, что бывают еще такие ссылки:
CODE (htmlphp):
скопировать код в буфер обмена
  1. <a class="au-elements__title__link_table"
  2.                            href="/car/used/vaz/2131_niva/8143857"
  3.                            title="">
  4.                             ВАЗ (LADA)
  5.                             2131 Нива
  6.                         </a>
  7.  
  8.  
  9.  
  10. <a class="au-elements__title__link_table"
  11.                            href="/car/used/8143853"
  12.                            title="">
  13.                             ВАЗ (LADA)
  14.                             2194 KALINA II
  15.                         </a>
  16.  
  17.  
  18.  
  19. <a class="au-elements__title__link_table"
  20.                            href="/car/used/vaz/largus/8143760"
  21.                            title="">
  22.                             ВАЗ (LADA)
  23.                             Largus
  24.                         </a>
  25.  
  26.  
  27. <a class="au-elements__title__link_table"
  28.                            href="/car/used/vaz/vaz_21102/8143593"
  29.                            title="">
  30.                             ВАЗ (LADA)
  31.                             2110
  32.                         </a>
  33.  
  34.  
  35. <a class="au-elements__title__link_table"
  36.                            href="/car/used/gaz/31105/8143283"
  37.                            title="">
  38.                             ГАЗ
  39.                             31105
  40.                         </a>
  41.  
  42. <a class="au-elements__title__link_table"
  43.                            href="/car/used/vaz/2170_priora_sedan/8143186"
  44.                            title="">
  45.                             ВАЗ (LADA)
  46.                             2170 PRIORA СЕДАН
  47.                         </a>


Задача не из легких: получить числовой индекс модели автомобиля (1111, 2110, 3110, 2170) из кода ссылки, а при отсутствии: текстовое название (Largus, Granta и т.д.)

У всех ссылок общее одно: название класса ссылок (au-elements__title__link_table).

Как это реализовать? Я пробовал, но получаются такие велосипеды, что конструкция ДВС по сравнению с ними кажется пустяком.

Пробовал вытянуть только числовой индекс, но как быть, если вместо индекса только название (например, Vesta):
PHP:
скопировать код в буфер обмена
  1. preg_match('~au-elements__title__link_table.+\)\s*(\d{4,4}).+<\/a>~Uis', $s, $model);


Но опять же, это работает только на Ладу, потому что в шаблоне используется скобка ")" и при условии что число из 4 символов.

(Отредактировано автором: 25 Сентября, 2016 - 11:25:20)

 
 Top
Itan
Отправлено: 25 Сентября, 2016 - 12:02:08
Post Id


Частый гость


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


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




И еще вопрос: допустим, мы выдернули текст между тегами <a></a>, но не знаем - есть там цифровой индекс модели автомобиля или только текстовый. Так вот, правильным ли будет обработка этого текста двумя регулярками: сначала проверка на наличие цифр, а если массив на выходе пустой, то ищем текстовый индекс модели, или это все можно сделать в одном шаблоне?
 
 Top
Строитель Модератор
Отправлено: 25 Сентября, 2016 - 12:07:50
Post Id



Участник


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


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




Itan пишет:
или это все можно сделать в одном шаблоне?
Можно и в одном - используйте побитовый оператор "или" | внутри вашего шаблона.
 
 Top
Fart
Отправлено: 25 Сентября, 2016 - 12:10:36
Post Id



Посетитель


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


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




перед тем как составить регулярку - нужно знать какие будут данные. если по 1 типу данных ковырять.. то тут кучу регулярок можно накаптить... а оно тебе надо? выложи список строчек данных которые будут и помощь не заставит себя ждать. ну и конечно какие данные нужно найти
 
 Top
Строитель Модератор
Отправлено: 25 Сентября, 2016 - 12:12:14
Post Id



Участник


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


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




Пример
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. $str = '195 строк';
  4.  
  5. preg_match_all('~\d+|\w+~iu', $str, $arr);
  6.  
  7. echo '<pre>'; var_dump($arr);
  8. /*
  9. array(1) {
  10.   [0]=>
  11.   array(2) {
  12.     [0]=>
  13.     string(3) "195"
  14.     [1]=>
  15.     string(10) "строк"
  16.   }
  17. }
  18. */
 
 Top
Itan
Отправлено: 25 Сентября, 2016 - 12:37:01
Post Id


Частый гость


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


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




Всем спасибо, разобрался. Наименование модели вытягивается из адреса ссылки, а не из текста ссылки, как я хотел изначально. Далее обработка: если цифр нет, берем слово.
(Добавление)
Я прям чувствую, как сгорают нервные клетки, но не подскажите ли вы, в чем ошибка?

Данные:
CODE (htmlphp):
скопировать код в буфер обмена
  1. 2170_priora_sedan
  2. 2131_niva
  3. vesta
  4. 2109
  5. granta
  6. 21941_kalina_ii_universal
  7. vaz_21102
  8. 21728_priora_coupe


Нужно вернуть либо число, либо оставить строку как есть (если, например, vesta).

Делал так:
PHP:
скопировать код в буфер обмена
  1. preg_match('~([0-9]+)|(^[a-z]+$)~is', $model[1], $finish_model);

И так:
PHP:
скопировать код в буфер обмена
  1. preg_match('~([0-9]+)|^([a-z]+)$~is', $model[1], $finish_model);

Или так:
PHP:
скопировать код в буфер обмена
  1. preg_match('~(\d+)|(\w+)~iu', $model[1], $finish_model);

Получается только номера вытянуть, а строки где нет цифр - возвращаются пустые.

В чем моя ошибка?

(Отредактировано автором: 25 Сентября, 2016 - 13:30:21)

 
 Top
Строитель Модератор
Отправлено: 25 Сентября, 2016 - 13:45:12
Post Id



Участник


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


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




Itan пишет:
В чем моя ошибка?
Используйте preg_match_all
PHP:
скопировать код в буфер обмена
  1. preg_match_all('~\d+|\w+~iu', $model[1], $finish_model);

(Добавление)
Я же выше опубликовал пример.

(Отредактировано автором: 25 Сентября, 2016 - 13:46:29)

 
 Top
Itan
Отправлено: 25 Сентября, 2016 - 15:05:35
Post Id


Частый гость


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


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




PHP:
скопировать код в буфер обмена
  1. preg_match('~(\d+|\w+)~iu', $model[1], $finish_model);

Работает, например, 21941_kalina_ii_universal превращается в 21941, а granta так и остается, всё как и задумано. Но есть одно но. Если этой регулярке передать строку vaz_2110, то она и вернет vaz_2110, хотя по идее, должна вернуть 2110. Как быть?
 
 Top
Строитель Модератор
Отправлено: 25 Сентября, 2016 - 15:30:01
Post Id



Участник


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


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




Itan пишет:
Как быть?
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. $model[1] = 'vaz_2110';
  4. preg_match_all('~\d+|\D+~iu', $model[1], $finish_model);
  5. echo '<pre>'; var_dump($finish_model[0]);
  6. /*
  7. array(2) {
  8.   [0]=>
  9.   string(4) "vaz_"
  10.   [1]=>
  11.   string(4) "2110"
  12. }
  13. */
 
 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