Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP正则表达式:以未知顺序匹配列表_Php_Regex - Fatal编程技术网

PHP正则表达式:以未知顺序匹配列表

PHP正则表达式:以未知顺序匹配列表,php,regex,Php,Regex,我正在尝试匹配一些CSS属性。然而,我无法预测它们的顺序 例如: header p { color:#f2f3ed; background-color:#353535; background-image: url(../images/dots.png); } 然而,我也应该期待: header p { background-image: url(../images/dots.png); background-color:#353535; color:#f2f3ed; } 以及这三种属性的任何

我正在尝试匹配一些CSS属性。然而,我无法预测它们的顺序

例如:

header p {
color:#f2f3ed;
background-color:#353535;
background-image: url(../images/dots.png);
}
然而,我也应该期待:

header p {
background-image: url(../images/dots.png);
background-color:#353535;
color:#f2f3ed;
}
以及这三种属性的任何其他组合。我们正在构建的web应用程序只允许我访问
preg\u match
功能

有人知道匹配所有可能属性组合的方法吗?我确切地知道这些属性是什么,我只是不知道它们的顺序


这么说来,我试图找到一个比键入所有可能的组合并用
|

将其分离更快的解决方案。超级不精确但又非常简单的方法是使用一系列备选方案:

/  ( \s* color:#\w+; | \s* bbb:... | \s* ccc:... ){3}  /x
量词
{3}
将确保存在三个备选方案,并且顺序无关紧要

但是,它允许三个
颜色:
属性匹配。您必须决定这是否足够重要,或者是否不太可能有人在CSS声明中连续编写三条
color:
语句。

多亏了lookahead操作符(?=)

/^(?=.*(:color |背景色|背景图像)\:.*)。/gm
还是有意见

^#行行间
(?=#正向前瞻(如果模式出现在当前位置之后,则为真;在本例中为当前行的开头)
.#在我们搜索的模式之前的任何内容
(?:color | background color | background image)\:\匹配这3个序列中的任意一个,后跟:char
*?#后面跟着的任何东西;但不要看第一个以外的东西;找到的
)
.#匹配发现(?=)的其他字符。
/gmx#修饰符:全局、多行、扩展(对于注释,忽略空格和#之后的任何内容)
您可以在这里尝试:

^before(?=.*对于效率非常重要! 否则,引擎将对每个位置尝试搜索一次


结尾。*(或.+或.++,所有格)只是为了匹配行,现在我们找到了正确的内容。

您应该使用CSS解析器,而不是仅在此处使用正则表达式。从技术上讲,您也可以多次调用
preg\u match
,一次用于您希望匹配的每个属性,但如果这是需要其他人维护或使用的代码,解析器是最好的方法我试着为它做一个正则表达式,但是它让我的面条油炸了,前面有选择器,中间有很多火柴。如果可以,你也可以使用PrimgMatMatkyAL并用它来迭代所有的线。