2012-09-20 47 views
1

Short question:我有一个包含CSS的$ css变量,我想在该变量中找到给定的样式(在我的情况下是“body”),并用自定义样式替换它。如何使用PHP替换CSS样式?

基本输入输出

/* blablabla */ 
body { 
    background-color:#d0e4fe; 
    font-family: 'Afamily', sanas-serif; 
} 
span { 
    padding: 5px 
} 
h1 { 
    color:orange; 
    text-align:center; 
} 
body { 
    margin: 10px; 
    padding: 5px; 
} 
p { 
    font-family:"Times New Roman"; 
    font-size:20px; 
} 

我们称之为magicFunction():

echo magicFunction($css, 'font-color: pink; font-weight: bold;'); 

而我们得到:

/* blablabla */ 
body { 
    font-color: pink; font-weight: bold; 
} 
span { 
    padding: 5px 
} 
h1 { 
    color:orange; 
    text-align:center; 
} 
p { 
    font-family:"Times New Roman"; 
    font-size:20px; 
} 

有什么不对?基本上我stucked这里

$bodyPattern = '/body\s\{[.|\s]*/m'; 
$found = preg_match_all($bodyPattern, $css, $matches); 

它发现只有输出这样的东西:

"body { 
    '" 

行回来后什么都没有。

当然,一旦我有正确的正则表达式模式,我会使用preg_replace。

我为什么要那么做:我想用我的网站CSS建立一个通讯应用CssToInlineStyle,我想只改变车身造型,以避免一些样式被应用(如背景色) 。编辑:提及这一点是为了让你知道“为什么”,随时发表评论并给出你的观点,但请仅考虑上述问题,作为你应该回答的问题。

+0

你第一次怀疑,如果电子邮件客户端接受CSS这样呢? –

+0

是他们这样做,至少GMail的接受它,如果渲染是不是对别人好,这不是什么大不了的 – AsTeR

+0

我真的很感激所有不明原因的下降票! – AsTeR

回答

0

要么你serve your CSS-file with PHP。或者你在你的CSS中使用类似SASS的变量。

用PHP解析CSS并使用正则表达式替换变量将导致very bad performance,并给您的服务器带来很大的负担。

+0

我的问题没有从我的服务器服务于CSS,因为外部文件加载由许多客户受阻。我已经在使用LESS,但在我的情况下,我认为我不能写任何东西来擦除以前的声明。我不关心性能问题,因为我只运行这部分代码一次。 – AsTeR

0

我会使用这样的CSS。

<style> 
<? include style.php;?> 
</style> 

现在在style.php

body { <? magicFunction('font-color: pink; font-weight: bold;'); 
?> 
} 

h1 { 
    color:orange; 
    text-align:center; 
} 
p { 
    font-family:"Times New Roman"; 
    font-size:20px; 
} 

而且magicFunction会是这样

function magicFunction($style) { 
    echo $style; 
} 
+0

这是一个丑陋的诡计,但由于我使用LESS,我不认为嵌入式PHP代码会做任何事情。这也把我的应用程序的一个小功能的风格依赖关系。 – AsTeR

+0

@AsTeR:这是一个丑陋的伎俩好吧,但而不是嵌入LESS PHP(这将很可能导致编译错误),这将是更容易产生从PHP一个LESS文件。 –

+0

这将需要运行PHP,再到少跑这当一个客户端在等待......坏主意 – AsTeR

1

我相信你的正则表达式后是这样的: body {(([a-zA-Z0-9:;#%\(\)\'\-])*\s*)*} - 你需要的格式它适合在PHP多线。

您需要的每一个字符匹配除了{},以确保您只捕获的机身风格,而不是所有样式。

我也推荐使用this site在尝试使用它之前测试regex。我同意其他评论,我认为你的做法有点疯狂......但用诺曼贝茨的话说'我们都有时会有点生气',我知道我有。希望这可以帮助。

编辑:

<?php 
    $css = "body { \n 
     color:#899890;\n 
     }"; 
    $pattern = '/body(\s){0,1}{(([a-zA-Z0-9:;#%\(\)\'\-])*\s*)*}/m'; 
    $found = preg_match_all($pattern, $css, $matches); 

    print_r($matches); 
?> 

生产:

Array 
(
    [0] => Array 
     (
      [0] => body { 

     color:#899890; 

     } 
     ) 

    [1] => Array 
     (
      [0] => 
     ) 

    [2] => Array 
     (
      [0] => 
     ) 

    [3] => Array 
     (
      [0] => ; 
     ) 

) 

这似乎为我工作。为了避免需要做这个

+0

谢谢,第一个答案竟是一个答案(和报价使得它非常)。我知道这个设计并不完美,但我接受变得有点疯狂,因为没有其他方法看起来好一点TMHO。我正在测试,尽快。 – AsTeR

+0

它不适用于多行,我理论中的元字符和模式中的m选项应该可以完成这项工作,不是吗? – AsTeR

+0

我在我的机器上试了一下,并得到它的工作。看我的编辑。 – Dpolehonski

0

一种方式是通过利用CSS的级联功能:

body { 
    background-color:#d0e4fe; 
    font-family: 'Afamily', sanas-serif; 
} 

<? if (...): ?> 
    body { 
     // overrides the definitions applied above 
     background-color: inherit; 
     font-family: inherit; 

     // and define your own rules 
     font-color: pink; 
     font-weight: bold; 
    } 
<? endif; ?> 
+0

看到@vusan答案,我的评论 – AsTeR

+0

@AsTeR :我不是在建议嵌入式PHP,而是将这些代码放在HTML文件中;如果您甚至不使用PHP来生成HTML,if语句也可以替换为/ * * /。 –

+0

那么TMHO的方法是一样的 – AsTeR