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]   

> Без описания
idiot3000
Отправлено: 31 Января, 2019 - 19:18:18
Post Id


Новичок


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


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




Добрый день!
Есть текст с следующими подстроками: [a id="11 22 33 444"] [b id="234"] [c id="9 123"]
Необходимо достать все числа, которые находятся в кавычках и ассоциировать их или с a или b или с.
Кол-во подстрок заранее не известно. Кол-во целых чисел в кавычках - одно или более.
Пока остановился на след. варианте:
preg_match_all('%\[(a|b|c)\sid="(\d+)\s?(\d+)?\s?(\d+)?\s?(\d+)?\s?(\d+)?\s?"\]%xs', $text, $matches, PREG_SET_ORDER);
Это вариант работает, но у него есть ограничение - макс 5 чисел в кавычках.
А как бы сделать чтобы без ограничений на кол-во?
Кто что может подсказать?
Заранее спасибо.
 
 Top
ytrewq123
Отправлено: 31 Января, 2019 - 20:30:25
Post Id


Посетитель


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


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




Попробуйте так.
PHP:
скопировать код в буфер обмена
  1.  
  2. $str = 'sfddf[a id="11 22 33 444"]dfffgvdf [b id="234"] fgvfgvdf[c id="9 123"]Пример использования  zkjcxj[d id="11 22 33 444 987 654 7888876 8"][e id="234"]zxdfkjhb jhhw34r3 kb43234[j id="234 543 8765 3"]';
  3. preg_match_all('/\[.*?\]/', $str, $ir);
  4. foreach($ir[0] as $str)
  5. {
  6.     preg_match('/[a-z]/', $str, $iarrr);
  7.     preg_match_all('/[\d].*[\d]/', $str, $iar);
  8.     $infa[$iarrr[0]] = $iar[0][0];
  9.     echo $iarrr[0].' Это - '.str_replace(' ', ', ', $iar[0][0]).'<br/>';
  10. }
  11. var_dump($infa);
  12.  
 
 Top
idiot3000
Отправлено: 31 Января, 2019 - 20:58:05
Post Id


Новичок


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


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




Спасибо, ytrewq123!
Да, ваш способ решает эту задачу.
Но использование вспомогательного цикла пока рассматриваю как запасной вариант.
Можно ли как то одним выражением все это достать?
Задача показалась мне простой на первый взгляд, но когда начал решать возникли трудности...
Предполагаю, что нужно использовать просмотры вперед или назад...
Не очень хорошо владею regex.
Если больше ничего не посоветуют, то, наверное, придется задействовать вспомогательный цикл.
 
 Top
ytrewq123
Отправлено: 31 Января, 2019 - 22:52:43
Post Id


Посетитель


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


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




Полностью с Вами согласен.
Надо подумать, до более рационального и оптимального кода!!!
 
 Top
Строитель Модератор
Отправлено: 31 Января, 2019 - 22:52:49
Post Id



Участник


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


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




idiot3000
PHP:
скопировать код в буфер обмена
  1. $text = '[a id="11 22 33 444"] [b id="234"] [c id="9 123"]';
  2.  
  3. $patt = '~\[(\pL) \h id="([^"]+)"\]~x';
  4. $result = [];
  5.  
  6. if (preg_match_all($patt, $text, $a)) {
  7.     $result = array_map(function($i){
  8.         return strtr($i, [' ' => '']);
  9.     }, array_combine($a[1], $a[2]));
  10. }
  11.  
  12. var_export($result);
  13. /*
  14. array(
  15.     'a' => '112233444',
  16.     'b' => '234',
  17.     'c' => '9123',
  18. )
  19. */
 
 Top
Мелкий Супермодератор
Отправлено: 01 Февраля, 2019 - 09:04:28
Post Id



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


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


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




idiot3000 пишет:
Можно ли как то одним выражением все это достать?

нет.
Подмасок должно быть фиксированное число.
Или регулярка, выхватывающая аттрибут id с дальнейшей обработкой до массива (explode, в частности)
Или один цикл. Но без регулярки, а пишете свой парсер строки на конечном автомате.


-----
PostgreSQL DBA
 
 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