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"
基本上我需要一个正则表达式来查找具有 1113321569
和 eyJhbGciOiJSUzI1NiJ9.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
)
我猜这个表达式可能有效:
"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"
}
}
我想在日志文件中找到 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"
基本上我需要一个正则表达式来查找具有 1113321569
和 eyJhbGciOiJSUzI1NiJ9.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
)
我猜这个表达式可能有效:
"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"
}
}