Как извлечь идентификационный номер из строки? - PullRequest
0 голосов
/ 26 мая 2019

Как получить среднее значение с помощью регулярных выражений или preg_match?

$str = 'fxs_124024574287414=base_domain=.example.com; datr=KWHazxXEIkldzBaVq_of--syv5; csrftoken=szcwad; ds_user_id=219132; mid=XN4bpAAEAAHOyBRR4V17xfbaosyN; sessionid=14811313756%12fasda%3A27; rur=VLL;'

Как получить значения только из ds_user_id с помощью регулярных выражений или preg_match?

Ответы [ 3 ]

3 голосов
/ 27 мая 2019

Используйте preg_match для сопоставления ds_user_id=, затем забудьте эти сопоставленные символы с \K, затем сопоставьте одну или несколько цифр.Без групп захвата, без обходных путей, без разбора всех пар ключ-значение, без взрыва.

Код: ( Демо )

$str = 'fxs_124024574287414=base_domain=.example.com; datr=KWHazxXEIkldzBaVq_of--syv5; csrftoken=szcwad; ds_user_id=219132; mid=XN4bpAAEAAHOyBRR4V17xfbaosyN; sessionid=14811313756%12fasda%3A27; rur=VLL;';
echo preg_match('~ds_user_id=\K\d+~', $str, $out) ? $out[0] : 'no match';

Выход:

219132
1 голос
/ 27 мая 2019

Хорошо, ничто не может побить конструкцию mickmackusa \K.
Но для двигателей с дефектами \ K это следующая лучшая вещь

(\d(?<=ds_user_id=\d)\d*)(?=;)

Объяснено

 (                          # (1 start), Consume many ID digits
      \d                         # First digit of ID
      (?<= ds_user_id= \d )      # Look behind, assert ID key exists before digit
      \d*                        # Optional the rest of the digits
 )                          # (1 end)
 (?= ; )                    # Look ahead, assert a colon exists

Это решение глагола (без \ K), примерно на 30% быстрее.

 (                             # (1 start), Consume many ID digits
      \d                            # First digit of ID
      (?:
           (?<! ds_user_id= \d )         # Look behind, if not ID,
           \d*                           # get rest of digits
           (*SKIP)                       # Fail, then start after this
           (?!)
        |  
           \d*                           # Rest of ID digits
      )
 )                             # (1 end)
 (?= ; )                       # Look ahead, assert a colon exists

Некоторые тесты для сравнения

Regex1:   (\d(?:(?<!ds_user_id=\d)\d*(*SKIP)(?!)|\d*))(?=;)
Options:  < none >
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   1
Elapsed Time:    0.53 s,   534.47 ms,   534473 µs
Matches per sec:   93,550


Regex2:   (\d(?<=ds_user_id=\d)\d*)(?=;)
Options:  < none >
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   1
Elapsed Time:    0.80 s,   796.97 ms,   796971 µs
Matches per sec:   62,737


Regex3:   ds_user_id=\K\d+(?=;)
Options:  < none >
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   1
Elapsed Time:    0.21 s,   214.55 ms,   214549 µs
Matches per sec:   233,046


Regex4:   ds_user_id=(\d+)(?=;)
Options:  < none >
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   1
Elapsed Time:    0.23 s,   231.23 ms,   231233 µs
Matches per sec:   216,232
0 голосов
/ 26 мая 2019

Если мы хотим использовать explode:

$str = 'fxs_124024574287414=base_domain=.example.com; datr=KWHazxXEIkldzBaVq_of--syv5; csrftoken=szcwad; ds_user_id=219132; mid=XN4bpAAEAAHOyBRR4V17xfbaosyN; sessionid=14811313756%12fasda%3A27; rur=VLL;';

$arr = explode(';', $str);

foreach ($arr as $key => $value) {
    if (preg_match('/ds_user_id/s', $value)) {
        $ds_user_id = explode('=', $value);
        echo $ds_user_id[1];
    }
}

Выход

219132

Здесь мы также можем использовать две группы без захвата с группой захвата:

(?:ds_user_id=)(.+?)(?:;)

, где у нас есть левая граница:

(?:ds_user_id=)

и правая граница:

(?:;)

, и мы собираем нужные цифры или что-либо еще, что мыжелая использовать:

(.+?)

Если мы хотим подтвердить наш идентификационный номер, мы можем использовать:

(?:ds_user_id=)([0-9]+?)(?:;)

DEMO

и желаемое значение можно просто вызвать с помощью var_dump($matches[0][1]);.

Test

$re = '/(?:ds_user_id=)(.+?)(?:;)/m';
$str = 'fxs_124024574287414=base_domain=.example.com; datr=KWHazxXEIkldzBaVq_of--syv5; csrftoken=szcwad; ds_user_id=219132; mid=XN4bpAAEAAHOyBRR4V17xfbaosyN; sessionid=14811313756%12fasda%3A27; rur=VLL;';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

// Print the entire match result
var_dump($matches);

Output

array(1) {
  [0]=>
  array(2) {
    [0]=>
    string(18) "ds_user_id=219132;"
    [1]=>
    string(6) "219132"
  }
}

DEMO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...