[英]regex pattern needed for extracting multiple parts of a specific string in 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.