【问题标题】:Regex pattern for splitting BEM string into parts (PHP)用于将 BEM 字符串拆分为多个部分的正则表达式模式 (PHP)
【发布时间】:2019-10-28 06:51:36
【问题描述】:

我想通过 PHP 正则表达式隔离字符串的块、元素和修饰符部分。我使用的 BEM 风格是小写和连字符。例如:

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

我的字符串总是按照上面的格式,所以regex不需要过滤掉任何无效的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

【问题讨论】:

    标签: php regex bem


    【解决方案1】:

    您可以使用 3 个捕获组,并使用 ? 将第三个设为可选

    由于所有 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))捕获组2,递归组1
    • (?:非捕获组
      • -- 字面匹配
      • ((?1))捕获组3,递归组1
    • )?关闭非捕获组并使其可选
    • \b字边界

    Regex demo

    或使用命名组:

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

    Regex demo

    【讨论】:

    • 非常感谢您,不仅为您提供答案,还为您解释和分解模式。有一些关于正则表达式的东西并没有出现在那里。你为我节省了几个小时来完成我需要做的事情。非常感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 2022-11-12
    • 2021-10-25
    • 1970-01-01
    相关资源
    最近更新 更多