我们在门户网站上为客户提供一些模板引擎。正在用数据源中的信息替换属性。
下面是一个这样的模板的例子,带有不同的引号和空格,嵌套在这里和那里:
<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的属性,而不获得class和id[/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函数。
以下(错误的(正则表达式太贪婪了:
( |()+(?:(?!(=|<|<|>|>|<=|>=|<>|<>|!=)).)*
最后一个正则表达式缺少什么?
至于您已经到达的最后一步,您可以使用
w[^=s]*(?=s*=)
查看regex演示
详细信息:
w
-单词字符(字母、数字或_
([^=s]*
-除=
和空白之外的零个或多个字符(?=s*=)
-一个积极的前瞻性,匹配一个紧接着零个或多个空格的位置,然后是一个=
字符