@Valenso

Как запомнить все вхождения?

Есть строка
целое gg =665 j h = 78;
Проверить ее на условие и запомнить символы gg, j, h.
Написал регулярку:

/^\s*целое\s+(?:\s*([a-z]+)\s*(?:=\s*[0-9]+\s*){0,1})+;$/

Получаю от нее
Array
(
[0] => Array
(
[0] => целое gg =665 j h = 78;
)

[1] => Array
(
[0] => h
)

)
Получилось, что запомнил только последнее вхождение, хочу поймать и все остальные тоже.
  • Вопрос задан
  • 3050 просмотров
Пригласить эксперта
Ответы на вопрос 6
danmiru
@danmiru
Это подойдет?

([a-z]+)[ =]*([0-9]*)

preg_match_all('/([a-z]+)[ =]*([0-9]*)/i', 'целое gg =665 j h = 78;', $result);

Array
(
[0] => Array
(
[0] => gg =665
[1] => j
[2] => h = 78
)

[1] => Array
(
[0] => gg
[1] => j
[2] => h
)

[2] => Array
(
[0] => 665
[1] =>
[2] => 78
)

)
Ответ написан
web36m
@web36m
Coder
Вы группируете (?:), а надо запоминать
Так не сгодится?
/^\s*целое\s*([a-z]+)\s*\=[0-9]+\s*([a-z]+)\s*([a-z]+)\s*\=\s*[0-9]+;$/
Ответ написан
web36m
@web36m
Coder
/^\s*целое\s+(?:\s*([a-z]+)\s*|([a-z]+)\s*\=\s*[0-9]+)+;$/
достает j и h жаль времени нет, доделал бы
Ответ написан
Wott
@Wott
Тут всплаывают особенности работы регулярок
1. повторное вхождение проверяется с места где закончилось предыдущее, так что не стоит ждать нескольких результатов от регулярки на всю строку — будет найден один результат, последний.
2. что бы получить все вхождения нужно совпадения всей регулярки

Из этого получаем что для (var=123)+ нужно писать одну а для проверки на «целое» — другую.
Ответ написан
Комментировать
@dsd_corp
Условие у вас конечно весьма расплывчатое.
ТЗ четко понятно только вам )
Из того, что я понял, для PHP:
$s="Есть строка\n".
"целое gg =665 j h = 78;".
"Проверить ее на условие и запомнить символы gg, j, h.".
"целое z s=234 f r = 35 s".
"целое a b c d e".
"целое i=23 j=13 k=4567 l=13243546 m=0".
"Написал регулярку:";

$r=preg_match_all('/целое(?:[\s]+[a-z]+(?:[\s]*?\=[\s]*?[\d]+)?)+/is', $s, $matches, PREG_SET_ORDER, 0);
if ($r==false || $r<=0) exit(0);
$result=array();
foreach ($matches as $m) {
  $r=preg_match_all('/[\s]+([a-z]+)(?:[\s]*?\=[\s]*?[\d]+)?/is', $m[0], $rmatches, PREG_SET_ORDER, 0);
  if ($r==false || $r<=0) continue;
  $res=array();
  foreach ($rmatches as $rs) {
    $res[]=$rs[1];
  }
  $result[]=$res;
}
@file_put_contents('out_html.txt', var_export(array($matches, $result), true));
exit(0);

Так, или иначе, нужно два прохода. На первом отбираем строки по формату, на втором получаем все необходимые аттрибуты.
Ответ написан
miraage
@miraage
Старый прогер
По вашему вопросу я подумал следущее.
Строка «целое gg =665 j h = 78;», но посмотрим на нее по другому:
«фигня запоминаем фигня запоминаем запоминаем фигня фигня;»

Сделайте explode по пробелу и заберите нужные индексы =)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы