我正在尝试用PHP替换一些CSS样式。
我想在任何.myclass
之后的所有#
和.
前面添加,
但不是那些行以background
和';'开头最后。
到目前为止,我的正则表达式无效。任何帮助将不胜感激。
这是我的PHP:
$patterns = '/^[^background][,]\s*((#|[.])[^;]+)/m';
$replacements = ', .myclass \1';
$str= preg_replace($patterns,$replacements, $string, -1);
这是最初的CSS:
#class1, #id1, #id2{
margin:0 0 1.5em 0;
font-size:2.2em;
font-family:Century Schoolbook Bold;
}
.class2{
background:#fff, #111, #ccc;
font:1.1em;
font-family:Century Schoolbook;
}
这是所需的CSS:
#class1, .myclass #id1, .myclass #id2{
margin:0 0 1.5em 0;
font-size:2.2em;
font-family:Century Schoolbook Bold;
}
.class2{
background:#fff, #111, #ccc;
font:1.1em;
font-family:Century Schoolbook;
}
答案 0 :(得分:0)
[blah]是一个字符类,这意味着它将匹配任何这些字母;所以[^ background]表示匹配该单词中的任何字符。同样,您不需要char类来匹配单个字符,例如逗号。
编辑:因为php不支持可变长度的lookbehind,所以遍历每一行,并跳过以background开头的那些:
foreach($lines as $line){
if(preg_match("/^\s*background.+\;$/",$line) == 0)
{
array_push($new, preg_replace("/,\s+#/",", .myclass ",$line));
}
else
{
array_push($new,$line);
}
}
或类似。
答案 1 :(得分:0)
我想用一个正则表达式解决你的任务是不可能的。 您需要可变长度的后视断言来解决它并且它们没有实现。 但如果是,那么解决方案就像:
/(?<!background:.*)(#[a-zA-Z_0-9]*)/
这里的问题是(?<!background:.*)
。你说.*
,这意味着这个断言可以有任何长度。它将继续工作。
更简单的解决方案是将任务分成两部分。
background
的行。background
,请运行preg_replace
。答案 2 :(得分:0)
“仅在逗号” - &gt;之后,在“#”和“,”之前添加.myclass
所以你想在.myclass
和,
之间添加#
?
即。每当您看到, #
时,您希望它是, .myclass #
?
我猜你只想影响定义CSS类的行(这就是你排除background: ...
的原因)。
在这种情况下,我建议采用以下标准:
“每当您看到,[space]#
时,只有当发生这种情况的行以, .myclass #
结尾>时才会将其转为{
STRONG>“。 (或者“只有当发生这种情况的行不以;
”结束时才会出现。)
这依赖于这样一个事实:当您创建CSS选择器时,您使用{
结束这一行,这些是您希望影响的唯一行。
然后我建议替换正则表达式:
/, *#(?=.+\{ *$)/m
with:
', .myclass #'
这是如何运作的:
, *# : "find a comma followed by 0 or more spaces and then a hash symbol,
(?= : FOLLOWED BY:
.+ : the rest of the line PLUS
\{ *$): an opening curly bracket at the end of the line (possibly spaces between this and the end of the line)
/m
表示如果$string
包含新行,则$
匹配行的结尾(而不是整个字符串$string
的结尾)。< / p>
在微调正则表达式方面,有一个游戏here(即验证你的正则表达式是首先,然后在PHP中试用它,所以,如果你有任何问题,你会知道它是一个正则表达式问题还是一个PHP问题。)