我正在尝试匹配数字并将其替换为(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
答案 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);