簡體   English   中英

PHP Regex模式混亂

[英]PHP Regex pattern confusion

我無法使幾個正則表達式模式起作用,所以我在其中搜索了大多數正則表達式模式,並在此過程中遇到了問題。 我在構建正則表達式模式時最了解游戲規則,但不了解如何創建用於檢查字符串中是否至少包含某種特定字符的正則表達式。 我在網上發現的:

'/^((?=.*\\d)(?=.*[az])(?=.*[AZ])(?=.*[@#$%]).{6,20})$/'

我不明白的是:

  • ?=.*含義是什么,意味着在一起或只是單獨的屬性
  • 為什么在那兒. 在花括號和普通花括號之間).{據我所知,它的任何特性,除非它表示先前提到的任何含義,但是什么使其能夠以這種方式工作
  • 最后一個問題是,正則表達式的工作方式實際上是檢查是否提供了所需的字符,但也允許鍵入類似ąó"(^! ąó ,當我看到此ąó時,我看不到任何提到的字符都允許

正如您已經知道的那樣,我試圖構建密碼驗證正則表達式並為此而苦苦掙扎。

編輯

如果可能的話,有人可以對此正則表達式進行修改,所以這並不意味着

  • 需要數字,小寫字母,大寫字母,提供的列表的特殊字符之一,並且比其他任何字符都要填空

所以它的意思是

  • 要求提供的列表中的數字,小寫,大寫,特殊字符之一,並用提及的規則字符填充空格,因此您可以繼續輸入提供的列表中的數字字母和特殊字符,但不能輸入某些特殊字符,如!óż

(?=...)是一個積極的超前斷言 它斷言,封閉的正則表達式可以在當前位置匹配,而無需實際執行匹配。 因此,例如, (?=.*\\d)意思是“檢查是否可以匹配任意數量的字符,后跟一個數字”,翻譯為“檢查字符串前面是否至少有一個數字” 。

分解正則表達式意味着:

^             # Start of string
(             # Match and capture in group 1:
 (?=.*\d)     # Assert that there is at least one digit in the string
 (?=.*[a-z])  # Assert that there is at least one lowercase letter in the string
 (?=.*[A-Z])  # Assert that there is at least one uppercase letter in the string
 (?=.*[@#$%]) # Assert that there is at least one of the characters @#$%
 .{6,20}      # Match 6-20 characters (any character except newlines)
)             # End of group
$             # End of string

順便說一句,捕獲組完全沒有必要。

/^((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{6,20})$/

^在字符串開頭的斷言位置

第一捕獲組((?=.*\\d)(?=.*[az])(?=.*[AZ])(?=.*[@#$%]).{6,20})

(?=.*\\d) 正向超前-斷言可以匹配以下正則表達式

任意數量的字符,后跟一個數字。 換句話說,字符串必須包含一個數字。

(?=.*[az]) 正向超前-聲明可以匹配以下正則表達式

任意數量的任何字符,后跟單個字符,介於a和z之間(區分大小寫)。 換句話說,字符串必須包含小寫字符。

(?=.*[AZ]) 正向超前-斷言可以匹配以下正則表達式

任意數量的任何字符,后跟單個字符,介於A和Z之間(區分大小寫)。 換句話說,字符串必須包含一個大寫字符。

(?=.*[@#$%]) 正向超前-斷言可以匹配以下正則表達式

任意數量的任何字符,然后按字面意義在列表@#$%中緊跟一個字符。 換句話說,字符串必須包含@#$%。

.{6,20}與6到20次之間的任何字符(換行符除外)匹配。

$在字符串末尾的斷言位置


引用人:

regex101


編輯:更改. [^__blacklisted_characters_here__]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM