簡體   English   中英

正則表達式模式,用於將BEM字符串拆分為多個部分(PHP)

[英]Regex pattern for splitting BEM string into parts (PHP)

我想通過PHP regex隔離字符串的塊,元素和修飾符部分。 我使用的BEM的樣式是小寫字母並帶有連字符。 例如:

this-defines-a-block__this-defines-an-element--this-defines-a-modifier

我的字符串總是按照上面的格式設置,因此正則表達式不需要過濾掉任何無效的BEM,例如,我永遠不會有像這樣的臟字符串:

This.defines-a-block__this-Defines-an-ELEMENT--090283

塊,元素和修飾符名稱可以包含數字,因此我們可以采用以下任意組合:

this-is-block-001__this-is-element-001--modifier-002

最后,修飾符是可選的,因此並非每個字符串都有一個,例如:

this-is-a-block-001__this-is-an-element
this-is-a-block-002__this-is-an-element--this-is-an-optional-modifier

我正在尋找一些正則表達式來返回BEM標記的每個部分。 每個字符串都將被隔離並單獨發送到正則表達式,而不是作為一個組或多行字符串。 以下分別發送:

# String 1
block__element--modifier

# String 2
block-one__element-one--modifier-one

# String 3
block-one-big__element-one-big--modifier-one-big

# String 4
block-one-001__element-one-001

將返回:

# String 1
block
element
modifier

# String 2
block-one
element-one
modifier-one

# String 3
block-one-big
element-one-big
modifier-one-big

# String 4
block-one-001
element-one-001

您可以使用3個捕獲組,並使用?將第三個捕獲組設為可選?

由於所有三個組都是小寫字母,可以包含數字並且可以使用連字符作為定界符,因此可以使用字符類[a-z0-9]

您可以使用(?1)將模式重用於組1

\b([a-z0-9]+(?:-[a-z0-9]+)*)__((?1))(?:--((?1)))?\b

說明

  • \\b字邊界
  • (第一個捕獲組
    • [a-z0-9]+重復1+次以上字符類中列出的內容
    • (?:-[a-z0-9]+)*重復匹配0+次-重復1+次字符類
  • )關閉第1組
  • __字面匹配
  • ((?1))捕獲組2,遞歸組1
  • (?:非捕獲組
    • --從字面上匹配
    • ((?1))捕獲組3,遞歸組1
  • )? 關閉非捕獲組並將其設置為可選
  • \\b字邊界

正則表達式演示

或使用命名組:

\b(?<block>[a-z0-9]+(?:-[a-z0-9]+)*)__(?<element>(?&block))(?:--(?<modifier>(?&block)))?\b

正則表達式演示

暫無
暫無

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

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