仅当数字不是十六进制颜色代码PHP的一部分时才匹配数字

时间:2016-05-17 15:52:11

标签: php regex colors

我正在尝试匹配数字并将其替换为(matched number)px

问题是,当他们不是十六进制颜色代码的一部分时,我想要匹配 ONLY 。我的输入可以包含两种方式的十六进制颜色代码: #xxx#xxxxxx,其中x可以是来自a-f的来信或来自0-9的来信。

我目前拥有的正则表达式是:

$input = preg_replace('/(?<!#..)(\d)(?!px)/i', '$1px', $input);

这仅适用于3位十六进制代码,并且仅当数字位于第三位时才有效。

我想要适用于所有情况的东西。这应该只替换那些不是十六进制代码的数字,并且在它们之后还没有px。谢谢!

编辑:因为负面的后视不能包含无限数量的字符(没有量词)我不知道该怎么做。

输入和输出应该是:

输入:#da4 10 输出:#da4 10px

输入:#122222 10 输出:#122222 10px

输入:#4444dd 20px 输出:#4444dd 20px

输入 30 10 20 20#414 20 99#da4 输出:30px 10px 20px 20px#414 20px 99px#da4

2 个答案:

答案 0 :(得分:1)

您可以使用(?<!#)\b(\d+)\b(?!px)(替换为$1px)。 Demo.

说明:

(?<!#)   make sure this isn't hex
\b       make sure we're matching the whole number, not just a part of it
(\d+)    capture the number
\b       again, make sure we've captured the whole number
(?!px)   make sure there's no px

答案 1 :(得分:1)

正则表达式:

\b(?<!#)\d+\b
# \b     Assert position at a word boundary 
# (?<!#) Negative Lookbehind
# \d+    Match a number with 1 to ilimited digits 
# \b     Assert position at a word boundary 

$input = '30 10 20 20 #414 20 99 #da4 #122222 10 #4444dd 20px';
$input = preg_replace('/\b(?<!#)\d+\b/', '$0px', $input);
print($input);

Code example