1

我需要一个正则表达式来执行以下操作-->

例如,

边距:7px 7px 7px 7px;

应该压缩成 -->

边距:7px;

(注:数字不能只有7,可以是任意数字。单位可以是px|em|%|in|cm|mm|pc|pt|ex)

4

3 回答 3

2

在重复4次的特定情况下,这绝对是可能的。

n使用反向引用,这对于数字重复次数的特定值是可能的。在你的情况下,n = 4.

这个匹配任何仅由字母字符组成的“单位”值,即“px”、“em”或“foo”,加上特殊情况“%”。\w*通过替换为更具体的匹配项,可以使其对特定单位的限制更大(?:em|px|......)

/^(\d+(?:\.\d+)?(?:\w*|%))\s+\1\s+\1\s+\1$/

例如:

// first four examples all match
echo preg_match('/^(\d+(?:\.\d+)?(?:\w*|%))\s+\1\s+\1\s+\1$/', '7px 7px 7px 7px');
1

echo preg_match('/^(\d+(?:\.\d+)?(?:\w*|%))\s+\1\s+\1\s+\1$/', '7em 7em 7em 7em');
1

echo preg_match('/^(\d+(?:\.\d+)?(?:\w*|%))\s+\1\s+\1\s+\1$/', '5px 5px 5px 5px');
1

echo preg_match('/^(\d+(?:\.\d+)?(?:\w*|%))\s+\1\s+\1\s+\1$/', '7% 7% 7% 7%');
1

echo preg_match('/^(\d+(?:\.\d+)?(?:\w*|%))\s+\1\s+\1\s+\1$/', '5.2cm 5.2cm 5.2cm 5.2cm');
1

// different value, no match
echo preg_match('/^(\d+(?:\.\d+)?(?:\w*|%))\s+\1\s+\1\s+\1$/', '5px 5px 5px 7px');
0

// not 4 elements, no match
echo preg_match('/^(\d+(?:\.\d+)?(?:\w*|%))\s+\1\s+\1\s+\1$/', '7px 7px 7px');
0

// different unit, no match
echo preg_match('/^(\d+(?:\.\d+)?(?:\w*|%))\s+\1\s+\1\s+\1$/', '7em 7em 7em 7px');
0
于 2013-02-05T12:17:46.563 回答
1

可能您不是要求特殊情况 7,而是要求所有四个都相同的任何数字。可以证明,不存在这样的正则表达式。

于 2013-02-05T12:02:04.533 回答
1

替换(\d+(px|em|%|in|cm|mm|pc|pt|ex))\s+\1\s+\1\s+\1$1

\d+匹配一个或多个数字 (px|em|%|in|cm|mm|pc|pt|ex)匹配任何一个提到的单位 \s+匹配一个或多个空格(用于匹配每次出现之间的分隔) \1匹配第一个捕获组,即数字后跟单位(4 次 \1 需要 4 次出现的数字+单位)

为了也允许小数部分,使用(\d+(.\d+)?(px|em|%|in|cm|mm|pc|pt|ex))\s+\1\s+\1\s+\1

替换为$1将匹配的输入替换为第一个捕获组

于 2013-02-05T12:20:11.660 回答