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
Форумы портала PHP.SU :: Версия для печати :: Достать все целые числа из подстроки
Форумы портала PHP.SU » PHP » Регулярные выражения » Достать все целые числа из подстроки

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

1. idiot3000 - 31 Января, 2019 - 19:18:18 - перейти к сообщению
Добрый день!
Есть текст с следующими подстроками: [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 чисел в кавычках.
А как бы сделать чтобы без ограничений на кол-во?
Кто что может подсказать?
Заранее спасибо.
2. ytrewq123 - 31 Января, 2019 - 20:30:25 - перейти к сообщению
Попробуйте так.
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.  
3. idiot3000 - 31 Января, 2019 - 20:58:05 - перейти к сообщению
Спасибо, ytrewq123!
Да, ваш способ решает эту задачу.
Но использование вспомогательного цикла пока рассматриваю как запасной вариант.
Можно ли как то одним выражением все это достать?
Задача показалась мне простой на первый взгляд, но когда начал решать возникли трудности...
Предполагаю, что нужно использовать просмотры вперед или назад...
Не очень хорошо владею regex.
Если больше ничего не посоветуют, то, наверное, придется задействовать вспомогательный цикл.
4. ytrewq123 - 31 Января, 2019 - 22:52:43 - перейти к сообщению
Полностью с Вами согласен.
Надо подумать, до более рационального и оптимального кода!!!
5. Строитель - 31 Января, 2019 - 22:52:49 - перейти к сообщению
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. */
6. Мелкий - 01 Февраля, 2019 - 09:04:28 - перейти к сообщению
idiot3000 пишет:
Можно ли как то одним выражением все это достать?

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

 

Powered by ExBB FM 1.0 RC1