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 を求めているのではなく、4 つすべてが同じである任意の数を求めているのでしょう。そのような正規表現が存在しないことを証明できます。

于 2013-02-05T12:02:04.533 に答える
1

(\d+(px|em|%|in|cm|mm|pc|pt|ex))\s+\1\s+\1\s+\1と置き換えます$1

\d+1 つまたは複数の数字 (px|em|%|in|cm|mm|pc|pt|ex)に一致 前述の単位のいずれかに \s+一致 1 つまたは複数の空白に一致 (各出現間の区切りを一致させるため) \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 に答える