Php 通过正则表达式仅使用4个参数查找CSS边距和填充

Php 通过正则表达式仅使用4个参数查找CSS边距和填充,php,css,regex,Php,Css,Regex,我将通过正则表达式找到所有仅具有4个参数的填充和边距,因此创建了如下regexp模式: (margin|padding)[ ]*:([ ]*((-*\d+(px|em|%|cm|in|pc|pt|mm|ex)?|auto|inherit)[ ]*)(!important)*){4}; 但是我发现了一个问题!它还通过了: margin: 1px 11px 4px; 但我不知道该如何解决这个问题,也不知道它还有其他问题或者是优化了吗? 如果可能,请编辑此内容或提供新图案。 谢谢您只需在单元之后删

我将通过正则表达式找到所有具有4个参数的填充和边距,因此创建了如下regexp模式:

(margin|padding)[ ]*:([ ]*((-*\d+(px|em|%|cm|in|pc|pt|mm|ex)?|auto|inherit)[ ]*)(!important)*){4};
但是我发现了一个问题!它还通过了:

margin: 1px 11px 4px;
但我不知道该如何解决这个问题,也不知道它还有其他问题或者是优化了吗? 如果可能,请编辑此内容或提供新图案。
谢谢

您只需在单元之后删除

(margin|padding)[ ]*:([ ]*((-*\d+(px|em|%|cm|in|pc|pt|mm|ex)|auto|inherit)[ ]*)(!important)*){4};
否则,无论中间是否有单位或空格,您的正则表达式都至少匹配4位数字的任何值

那么以下示例将不再匹配(它们与您的正则表达式匹配):

测试


编辑:有新的单位,如
vh
vw
。和
-前缀计算(10%-6px)
。如果你在分析遗留代码,没问题,但是如果你在搜索野生网络,你可能会发现一些类似的情况。

我的问题几乎类似于这个主题:。但是它还没有被回答!不,它现在不会以}结尾。但这是可能的。对不起,我删除了我的评论。我认为初始和/或终端空间有问题,但事实并非如此。请看我的答案:)但有时短语有单位。例如:
填充:自动0 4px 2em该部分没有更改,应该可以正常工作。我将用一些自动关键字编辑示例,看起来不错。是的,但当只有数字而没有任何单位时,它不起作用:
padding:4px auto**3**56px
我通过用单位分隔数字和不带单位的数字来解决这个问题:
(边距填充)[]*:([]*((-*\d+(px | em |%| cm | in | pc | pt | mm | ex)-*\d+|自动|继承)[]*(!重要)*{4}这不是填充的有效值,您不应该匹配它
padding: 1111px;
padding: 444px 6px;
padding: 4px 356px;
padding: 44px 36px;
padding: 4px 11px 3px;
padding: 4px 1px 3px 56px;

padding: auto;
padding: 4443px auto;
padding: auto 22356px;
padding: auto 36px 89em;
padding: 42px 11px auto;
padding: 4px auto 3px 56px;