正则表达式,用于获取单个特定字符(=,前面有或没有空格)之前的所有单词



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

下面是一个这样的模板的例子,带有不同的引号和空格,嵌套在这里和那里:

<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>

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

我们偶然发现了这个线程,这个答案,但由于它是用来查找html属性的,我们无法将模式简化为[%]之间的部分。而且,一旦属性和=之间存在空白,它就不再匹配。

考虑到[%]之间的任何内容以及可能的空白,我们应该如何修改线程/答案中的正则表达式,以获得类似findthis1/3/5/7/8/9/11/12/13的属性,而不获得classid[/em>?至于没有=的属性findthis15和findthis16,我们想为其找到另一个正则表达式。

编辑:我忘了提两件事:

  • findthis属性可以是类似于;电子邮件";或";名字">
  • 还有类似<=>=和=

编辑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函数。

以下(错误的(正则表达式太贪婪了:

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

最后一个正则表达式缺少什么?

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

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

查看regex演示

详细信息

  • w-单词字符(字母、数字或_(
  • [^=s]*-除=和空白之外的零个或多个字符
  • (?=s*=)-一个积极的前瞻性,匹配一个紧接着零个或多个空格的位置,然后是一个=字符

最新更新