неправильная версия преобразования регулярного выражения - PullRequest
1 голос
/ 10 апреля 2020

Эй, сообщество У меня проблема с использованием регулярного выражения, и вместо получения полной версии я получаю следующее _3, где я должен получить 13_3

Вот как я использую выражение -

$useragent = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148";
$pattern = '/os ([0-9]?.[0-9]?[0-9]?[0-9]?[0-9])*/';
preg_match($pattern,strtolower($useragent),$m);

Вот как я это использую для Android -

$useragent = "Mozilla/5.0 (Linux; Android 8.1.0; moto e5 play Build/OPGS28.54-53-8-11; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/80.0.3987.162 Mobile Safari/537.36";
$pattern = '/android ((\d+|\.).[^ ,);]+)/';
preg_match($pattern,strtolower($useragent),$m);

Я что-то не так делаю?

Ответы [ 3 ]

1 голос
/ 10 апреля 2020

В вашем шаблоне вы не учитываете возможное подчеркивание.

Эта часть [0-9]?.[0-9]?[0-9]?[0-9]?[0-9] соответствует необязательному ди git, любому символу, кроме символа новой строки, за которым следуют 3 необязательные цифры и ди git, которые также могут совпадать, например, x1

Вы получаете значение _13, потому что вы повторяете сам захват, захватывая значение последней итерации.

В качестве альтернативы вы также можете использовать \K для очистки буфера соответствия и получения соответствия только.

\bos\h+\K\d+(?:_\d+)*\b
  • \b Граница слова
  • os Совпадение буквально
  • \h+\K Совпадение 1+ горизонтальных пробелов, затем забудьте, что было
  • \d+(?:_\d+)* Совпадение 1+ di git, возможно, повторяется _ и 1+ цифрами
  • \b Граница слова

Regex demo

Например

$useragent = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148";
$pattern = '/\bos\h+\K\d+(?:_\d+)*\b/';
preg_match($pattern,strtolower($useragent),$m);
print_r($m[0]);

Выход

13_3
0 голосов
/ 10 апреля 2020

preg_match('/os ([0-9].(?:_?[0-9]+)+)*/gi',$useragent,$m);

тогда это будет код:

$useragent = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_33 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148";
if (preg_match('/os ([0-9].(?:_?[0-9]+)+)*/', $useragent, $m)) {
    var_dump($m);
}

выход в группе 1: 13_3_33

0 голосов
/ 10 апреля 2020

Вы можете использовать

preg_match('/os\s+([0-9]+(?:_[0-9]+)*)/i', $useragent, $m)

См. Демоверсию regex .

  • os - строка
  • \s+ - 1+ пробелов
  • ([0-9]+(?:_[0-9]+)*) - Группа захвата 1:
    • [0-9]+ - 1+ цифр
    • (?:_[0-9]+)* - 0 или более вхождений _ и 1+ цифр.

См. PHP демо :

$useragent = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148";
if (preg_match('/os\s+([0-9]+(?:_[0-9]+)*)/i', $useragent, $m)) {
   print_r($m);
}
...