【问题标题】:Regular Expression to get all words before a single certain character (=, with or without whitespaces before)正则表达式获取单个特定字符之前的所有单词(=,之前有或没有空格)
【发布时间】:2021-01-09 13:32:32
【问题描述】:

我们在我们的门户网站上为我们的客户提供一些模板引擎。属性被数据源中的信息替换。

以下是此类模板的外观示例,其中包含不同的引号和空格变体,以及此处和此处的嵌套:

<html>
    <body>
        <h1 class="title">Some Title</h1>
        <div id="output">
            [%if findthis1='123']
                Bla bla bla ["findthis2"] Bla Bla Bla
            [%elseif (findthis3 = "123")]
                Bla Bla Bla ['findthis4'] Bla Bla Bla
            [%elseif ( findthis5 = "123" )]
                Bla Bla Bla [findthis6] Bla Bla Bla
            [%elseif (   findthis7   =   "123" OR findthis8   =   123   )    AND       findthis9='123']
                [findthis10] Bla Bla Bla
            [%elseif ( findthis11 = "123" OR ( findthis12=123 AND findthis13='123' ) ]
                 Bla Bla Bla [findthis14]
            [%endif]

            [%uppercase findthis15]
            [%lowercase findthis16 ]
        </div>
    </body>
</html>

我们的目标是获取字符 = 之前在 [%] 之间可能出现空格的所有单词。

我们偶然发现了this threadthis answer,但由于它是用来查找 html 属性的,因此我们无法将模式减少到 [%] 之间的部分。而且,一旦属性和= 之间有空格,它就不再匹配了。

我们应该如何修改线程/答案中看到的正则表达式以获得像findthis1/3/5/7/8/9/11/12/13这样的属性/em> 没有获得 classid,考虑到 [%] 之间的任何内容,并且可能空格?至于没有=的属性findthis15和findthis16,我们想再找一个正则表达式。

编辑:我忘了提到两件事:

  • findthis-Attributes 可以是“email”或“firstname”之类的任何内容
  • 还有 = 和 != 等运算符

编辑 2:现在,我正在考虑使用多个正则表达式。第一个是\[\%(.)*\],这将使我得到所有以[% 开头并以] 结尾的行。我试图找出下一个正则表达式来检查其中是否有运算符,或者它是否是这些行之一,例如[%uppercase findthis15]

编辑 3:3 的第二个正则表达式如下所示:

(\S+)+[\ ]*((=|<>|!=))

编辑 4:好的,经过一些试验,我们仍然无法改进正则表达式以实现我们的目标。

通过使用/\[\%(if|elseif)(.)*?(\])/,我们得到了这样的结果(请忽略我使用与上述不同的行的事实):

[%if hello="abc" OR ( (stack=123 AND overflow = "bla") OR (how= 'bla' AND are ='bla') AND you = 'xyz' )]

但现在,最后一步是使用 PHP 的 preg_match 函数获取单词“hello”、“stack”、“overflow”、“how”、“are”和“you”。

下面的(错误的)正则表达式太贪心了:

(\ |\()+(?:(?!(=|<|&lt;|>|&gt;|<=|>=|<>|&lt;&gt;|!=)).)*

我们在这个最终的正则表达式中缺少什么?

【问题讨论】:

  • 添加预期结果的示例将有助于理解您的问题。都是findthis 字吗?如果是这样,您的问题似乎只涉及其中一些(= 之前),而您的代码包含其他问题,例如 [%uppercase findthis15]
  • @El_Vanja 这些 findthis-Attributes 可以是任何东西,例如“email”、“gender”、“firstname”、“lastname”等。就像我在上一句中提到的那样,我们会写一个不同的“非运算符语句”的正则表达式,例如 [%uppercase findthis15]
  • EDIT4 正则表达式很简单,\w+(?=\s*=)\w[^=\s]*(?=\s*=)
  • @WiktorStribiżew 嗨,Wiktor,非常感谢。我刚刚尝试了您提到的两种解决方案中的第一种,看起来效果很好。

标签: php regex


【解决方案1】:

至于你已经到的最后一步,你可以使用

\w[^=\s]*(?=\s*=)

regex demo

详情

  • \w - 一个单词字符(字母、数字或_
  • [^=\s]* - 除了= 和空格之外的零个或多个字符
  • (?=\s*=) - 与紧跟零个或多个空格然后是 = 字符的位置匹配的正向前瞻。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 2013-02-18
    相关资源
    最近更新 更多