s3存储桶名称

时间:2018-05-23 06:06:20

标签: json regex amazon-s3

我试图通过cloudformation创建一个s3存储桶。我尝试使用正则表达式^([0-9a-z .-]){3,63} $,但它也接受模式" ..."和" ---"根据新的s3命名约定无效。 (参考:https://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html)请帮帮忙?

8 个答案:

答案 0 :(得分:3)

规格有点令人困惑,但主要标准似乎是:

  • 存储桶名称长度必须至少为3且不超过63个字符。
  • 存储桶名称必须是一系列一个或多个标签。
  • 存储桶名称可以包含小写字母,数字和连字符。
  • 每个标签必须以小写字母或数字开头和结尾。
  • 相邻标签由单个句点(。)
  • 分隔
  • 不得将存储桶名称格式化为IP地址(例如,192.168.5.4)

如果是这样,那么这个正则表达式应该匹配:

(?=^.{3,63}$)(?!^(\d+\.)+\d+$)(^(([a-z0-9]|[a-z0-9][a-z0-9\-]*[a-z0-9])\.)*([a-z0-9]|[a-z0-9][a-z0-9\-]*[a-z0-9])$)

第一组(?=^.{3,63}$)向前看以确保匹配长度在3到63个字符之间。

下一组(?!^(\d+\.)+\d+$)向前看禁止匹配看起来像IP地址的存储桶名称。

最后一组(^(([a-z0-9]|[a-z0-9][a-z0-9\-]*[a-z0-9])\.)*([a-z0-9]|[a-z0-9][a-z0-9\-]*[a-z0-9])$)匹配零个或多个标签,后跟一个点(([a-z0-9]|[a-z0-9][a-z0-9\-]*[a-z0-9])\.)*,后面只有一个标签([a-z0-9]|[a-z0-9][a-z0-9\-]*[a-z0-9])

答案 1 :(得分:3)

我对Zak的答案做了一些调整。我发现这有点太复杂了,因此抛出了有效的域名。这是新的正则表达式(可在regex101.com **上进行测试):

    <?php

require_once("db.php");
$book_title = $book_author = $book_category = $isbn_no = $purchase_date = $edition = $pages = $publisher = $book_link = $book_internal = $cover_art = '';

if(isset($_POST['upload_books'])) {


    $file = $_FILES["book_internal"]; //getting user uploaded file

    move_uploaded_file($file["tmp_name"], "uploads/books" .$file["name"]); //save file to upload folder




$book_title = mysqli_real_escape_string($conn, $_POST['book_title']);
$book_author = mysqli_real_escape_string($conn, $_POST['book_author']);
$book_category = mysqli_real_escape_string($conn, $_POST['book_category']);
$isbn_no = mysqli_real_escape_string($conn, $_POST['isbn_no']);
$purchase_date = mysqli_real_escape_string($conn, $_POST['purchase_date']);
$edition = mysqli_real_escape_string($conn, $_POST['edition']);
$pages = mysqli_real_escape_string($conn, $_POST['pages']);
$publisher = mysqli_real_escape_string($conn, $_POST['publisher']);
$book_link = mysqli_real_escape_string($conn, $_POST['book_link']);
$book_internal = mysqli_real_escape_string($conn, $_POST['book_internal']);
$cover_art = mysqli_real_escape_string($conn, $_POST['cover_art']);


    $sql = "INSERT INTO books (book_title, book_author, book_category, isbn_no, purchase_date, edition, pages, publisher, book_link, book_internal, cover_art)
    VALUES ('$book_title', '$book_author', '$book_category', '$isbn_no', '$purchase_date', '$edition', '$pages', '$publisher', '$book_link', '$book_internal', '$cover_art')";

    $result = mysqli_query($conn, $sql);

    if($result) {
        header("location: upload-books.php");
        echo "Upload successful!";

    }
    else {
        echo "Error:".mysqli_error($conn);
    }


}

 ?>

第一部分是负前行(?!^(\d{1,3}\.){3}\d{1,3}$)(^[a-z0-9]([a-z0-9-]*(\.[a-z0-9])?)*$) ,它仅与有效IP地址匹配。基本上,我们尝试匹配1-3个数字,然后匹配3个周期((?!^(\d{1,3}\.){3}\d{1,3}$)),再匹配1-3个数字(\d{1,3}\.){3})。

第二部分说明名称必须以小写字母或数字(\d{1,3})开头,后跟0至多次(^[a-z0-9])的小写字母,数字或连字符。如果有句点,则必须在其后加上小写字母或数字([a-z0-9-]*)。最后两个模式重复0到很多次((\.[a-z0-9])?)。

正则表达式不会尝试强制执行A​​WS规定的大小限制(3-63个字符)。可以通过另一个正则表达式(([a-z0-9-]*(\.[a-z0-9])?)*)或通过检查字符串的大小来解决。


**在该链接上,我添加的测试之一失败了,但是,如果您切换到测试区域并键入相同的模式,则测试通过。如果将其复制/粘贴到终端中,它也可以工作,因此我认为这是regex101.com方面的错误。

答案 2 :(得分:1)

<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.4.0/Chart.bundle.min.js"></script>

答案 3 :(得分:0)

修改:修改正则表达式以允许所需大小(3-63)并添加其他一些选项。

名称必须符合DNS标准,因此您可以尝试使用:

In [54]: DF1['new_col'] = DF1.Team.map(DF2.set_index('Team').Rating)

In [55]: DF1
Out[55]: 
  Team  new_col
0    A        1
1    B        2
2    C        3
3    D        4
4    E        5
5    A        1
6    C        3
7    B        2
8    B        2

请参阅:https://regexr.com/3psne

如果您需要使用句号,请使用此选项:

^[A-Za-z0-9][A-Za-z0-9\-]{1,61}[A-Za-z0-9]$

请参阅:https://regexr.com/3psnb

最后,如果您想禁止连续两个“非单词”字符,可以使用:

^[A-Za-z0-9][A-Za-z0-9\-.]{1,61}[A-Za-z0-9]$

请参阅:https://regexr.com/3psn8

基于:Regexp for subdomain

答案 4 :(得分:0)

我使用了@Zak正则表达式,但并非100%正确。我将this用于AWS桶名称的所有规则。我逐步进行验证,因此看起来像这样:

  • 存储桶名称必须至少3个字符且不超过63个字符-> ^.{3,63}$
  • 存储桶名称中不得包含大写字符或下划线-> [A-Z_]
  • 桶名必须以小写字母或数字开头-> ^[a-z0-9]
  • 桶名称不得格式化为IP地址(例如192.168.5.4)-> ^(\d+\.)+\d+$。这比AWS更为严格。
  • 桶名称必须是一系列一个或多个标签。相邻标签之间用单个句点(。)->在python if ".." in bucket_name:
  • ..每个标签必须以小写字母或数字结尾-> ^(.*[a-z0-9]\.)*.*[a-z0-9]$

答案 5 :(得分:0)

S3存储桶名称的正则表达式:

String S3_REPORT_NAME_PATTERN = "[0-9A-Za-z!\\-_.*\'()]+";

String S3_PREFIX_PATTERN   = "[0-9A-Za-z!\\-_.*\\'()/]*";

String S3_BUCKET_PATTERN = "(?=^.{3,63}$)(?!^(\\d+\\.)+\\d+$)(^(([a-z0-9]|[a-z0-9][a-z0-9\\-]*[a-z0-9])\\.)*([a-z0-9]|[a-z0-9][a-z0-9\\-]*[a-z0-9])$)";

答案 6 :(得分:0)

AWS发布了新指南,其中“。”不建议使用,并且以'xn--'开头的存储桶名称现已被禁止(https://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html)。如果您不允许“。”正则表达式变得更具可读性:

(?=^.{3,63}$)(?!xn--)([a-z0-9](?:[a-z0-9-]*)[a-z0-9])$

答案 7 :(得分:0)

以下正则表达式满足AWS规范,前提是您不希望在存储桶名称中允许.(这是建议,否则将无法启用Transfer Acceleration):

^((?!xn--)[a-z0-9][a-z0-9-]{1,61}[a-z0-9])$

这是一个好方法,因为它可以被合并到更复杂的检查中,只需用其他字符串替换^$,从而可以进行ARN检查等等。