Regex/ PHP - 在文本中查找包含两个变量的字符串

Regex/ PHP - Finding an String inside a text with two variables inside

我想在日志文件中找到 Url 的所有匹配项,然后提取这些匹配项的一些数据。我对正则表达式一点都不擅长,所以我找不到。

我正在尝试查找的事件:

// this is the string i want to find,
// in every match 1113321569 and the acceses_token will change

Api::log : {"url":"https://api.test.com//v0/notes/1113321569/notes?access_token=eyJhbGciOiJSUzI1NiJ9.eyJydGUiOiIxNTYyMDM5NjUxNDgxIiwidXNlcl9pZCI6MTAzMTU1MzI0MywidXNlcl9"

基本上我需要一个正则表达式来查找具有 1113321569eyJhbGciOiJSUzI1NiJ9.eyJydGUiOiIxNTYyMDM5NjUxNDgxIiwidXNlcl9pZCI6MTAzMTU1MzI0MywidXNlcl9 作为变量的文本,在找到整个字符串后我需要提取这两个变量。

你们能帮帮我吗?

您可以使用正则表达式 (?<=\/)(\d+)(?=\/).+(?:=)(\S+)(?:"):

preg_match('/(?<=\/)(\d+)(?=\/).+(?:=)(\S+)(?:")/', $input_line, $output_array);

这利用正 look-behinds 和正 look-aheads 对两个目标进行分组:

array(3
    0   =>  1113321569/notes?access_token=eyJhbGciOiJSUzI1NiJ9.eyJydGUiOiIxNTYyMDM5NjUxNDgxIiwidXNlcl9pZCI6MTAzMTU1MzI0MywidXNlcl9"
    1   =>  1113321569
    2   =>  eyJhbGciOiJSUzI1NiJ9.eyJydGUiOiIxNTYyMDM5NjUxNDgxIiwidXNlcl9pZCI6MTAzMTU1MzI0MywidXNlcl9
)

这可以在 Regex101 上看到 here and PHPLiveRegex here.

我猜这个表达式可能有效:

"url":"(.+\/([0-9]{10})\/.+access_token=(.+?))"

我们想要的输出在组 [1]、[2] 和 [3] 中。

测试

$re = '/"url":"(.+\/([0-9]{10})\/.+access_token=(.+?))"/s';
$str = 'Api::log : {"url":"https://api.test.com//v0/notes/1113321569/notes?access_token=eyJhbGciOiJSUzI1NiJ9.eyJydGUiOiIxNTYyMDM5NjUxNDgxIiwidXNlcl9pZCI6MTAzMTU1MzI0MywidXNlcl9"
';

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

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

Demo

输出

array(1) {
  [0]=>
  array(4) {
    [0]=>
    string(157) ""url":"https://api.test.com//v0/notes/1113321569/notes?access_token=eyJhbGciOiJSUzI1NiJ9.eyJydGUiOiIxNTYyMDM5NjUxNDgxIiwidXNlcl9pZCI6MTAzMTU1MzI0MywidXNlcl9""
    [1]=>
    string(149) "https://api.test.com//v0/notes/1113321569/notes?access_token=eyJhbGciOiJSUzI1NiJ9.eyJydGUiOiIxNTYyMDM5NjUxNDgxIiwidXNlcl9pZCI6MTAzMTU1MzI0MywidXNlcl9"
    [2]=>
    string(10) "1113321569"
    [3]=>
    string(88) "eyJhbGciOiJSUzI1NiJ9.eyJydGUiOiIxNTYyMDM5NjUxNDgxIiwidXNlcl9pZCI6MTAzMTU1MzI0MywidXNlcl9"
  }
}