JMESPATH 可以执行 "contains X or Y" search/filter 吗?
Can JMESPATH perform a "contains X or Y" search/filter?
是否可以使用 contains
将下面的 preg_match
搜索移动到 JMESPATH 搜索过滤器中?我在 JMESPATH tutorial 中找到了 contains
的示例,但我不确定该语法是否支持使用 OR
.
以某种方式组合过滤器字符串
$s3_results = $s3_client->getPaginator('ListObjects', ['Bucket' => $config['bucket']]);
// Narrow S3 list down to files containing the strings "css_" or "js_".
foreach ($s3_results->search('Contents[].Key') as $key) {
if (preg_match("/(css_|js_)/", $key)) {
$s3_keys[] = $key;
}
}
当然,or expression 确实存在于 JMESPath 中。
但是,您甚至可以更进一步,完全放弃 for 循环并使用 functions expression.
获取密钥
给定数据:
{
"Contents": [
{
"Key": [
"css_foo",
"js_bar",
"brown_fox"
]
},
{
"Key": [
"js_foo",
"css_bar",
"lazy_dog"
]
}
]
}
然后
$keys = $s3_results->search(
'Contents[].Key[?contains(@, `js_`) == `true` || contains(@, `css_`) == `true`]'
);
会给你下面的二维数组(因为有两个内容):
array(2) {
[0] =>
array(2) {
[0] =>
string(7) "css_foo"
[1] =>
string(6) "js_bar"
}
[1] =>
array(2) {
[0] =>
string(6) "js_foo"
[1] =>
string(7) "css_bar"
}
}
或者更简单,因为 contains
returns true
或 false
,已经:
$keys = $s3_results->search(
'Contents[].Key[?contains(@, `js_`) || contains(@, `css_`)]'
);
假设文档的格式如下:
{
"Contents": [
{
"Key": "some/path/css_example",
...
},
{
"Key": "another/path/js_example",
...
},
{
"Key": "blah/blah/other_example",
...
}
]
}
(我会检查,但我手头没有 AWS 凭证,而且很难找到 S3 list-objects 响应的 JSON 格式的示例。)
尝试查询:
Contents[].Key|[?contains(@, 'css_') || contains(@, 'js_')]
在这种情况下,Contents[].Key
select只是键(如您的示例所示)。管道 |
用于重置投影,以便我们对整个列表进行操作,而不是分别对每个键进行操作。 [?...]
将列表过滤为 select 只有满足布尔条件的键。 contains
函数可以多种方式使用,但我们在这里使用它来查看作为字符串(@
,列表中的当前项)的第一个参数是否包含第二个参数,即我们的子字符串正在寻找。我们将 contains
函数的两种用法与 or 运算符 ||
组合在一起,以便如果 either 条件为真,则项目匹配。
是否可以使用 contains
将下面的 preg_match
搜索移动到 JMESPATH 搜索过滤器中?我在 JMESPATH tutorial 中找到了 contains
的示例,但我不确定该语法是否支持使用 OR
.
$s3_results = $s3_client->getPaginator('ListObjects', ['Bucket' => $config['bucket']]);
// Narrow S3 list down to files containing the strings "css_" or "js_".
foreach ($s3_results->search('Contents[].Key') as $key) {
if (preg_match("/(css_|js_)/", $key)) {
$s3_keys[] = $key;
}
}
当然,or expression 确实存在于 JMESPath 中。
但是,您甚至可以更进一步,完全放弃 for 循环并使用 functions expression.
获取密钥给定数据:
{
"Contents": [
{
"Key": [
"css_foo",
"js_bar",
"brown_fox"
]
},
{
"Key": [
"js_foo",
"css_bar",
"lazy_dog"
]
}
]
}
然后
$keys = $s3_results->search(
'Contents[].Key[?contains(@, `js_`) == `true` || contains(@, `css_`) == `true`]'
);
会给你下面的二维数组(因为有两个内容):
array(2) {
[0] =>
array(2) {
[0] =>
string(7) "css_foo"
[1] =>
string(6) "js_bar"
}
[1] =>
array(2) {
[0] =>
string(6) "js_foo"
[1] =>
string(7) "css_bar"
}
}
或者更简单,因为 contains
returns true
或 false
,已经:
$keys = $s3_results->search(
'Contents[].Key[?contains(@, `js_`) || contains(@, `css_`)]'
);
假设文档的格式如下:
{
"Contents": [
{
"Key": "some/path/css_example",
...
},
{
"Key": "another/path/js_example",
...
},
{
"Key": "blah/blah/other_example",
...
}
]
}
(我会检查,但我手头没有 AWS 凭证,而且很难找到 S3 list-objects 响应的 JSON 格式的示例。)
尝试查询:
Contents[].Key|[?contains(@, 'css_') || contains(@, 'js_')]
在这种情况下,Contents[].Key
select只是键(如您的示例所示)。管道 |
用于重置投影,以便我们对整个列表进行操作,而不是分别对每个键进行操作。 [?...]
将列表过滤为 select 只有满足布尔条件的键。 contains
函数可以多种方式使用,但我们在这里使用它来查看作为字符串(@
,列表中的当前项)的第一个参数是否包含第二个参数,即我们的子字符串正在寻找。我们将 contains
函数的两种用法与 or 运算符 ||
组合在一起,以便如果 either 条件为真,则项目匹配。