2012-09-20 3 views
1

Короткий вопрос: У меня переменная $ css, содержащая CSS, я хотел бы найти данный стиль (в моем случае «тело») в этой переменной и заменить его на пользовательский стиль.Как заменить стиль CSS с помощью PHP?

Базовый ввод-вывод:

/* 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.

Почему я хочу сделать это: Я хочу, чтобы применить CssToInlineStyle с помощью моего сайта CSS, чтобы создать информационный бюллетень, я хотел бы изменить только стиль тела, чтобы избежать какого-то стиля для применения (например, цвет фона) , EDIT: Этот момент упоминается, чтобы вы знали, «почему», не стесняйтесь комментировать и дайте свою точку зрения на это, но, пожалуйста, рассмотрите только указанный выше вопрос как то, на что вы должны отвечать.

+0

Вы сначала удивление, если клиенты электронной почты принимают CSS, как это? –

+0

Да, они делают, по крайней мере, GMail принимает его, если рендеринг не так хорош для других, это не имеет большого значения. – AsTeR

+0

Я действительно ценю все необъяснимые голоса! – AsTeR

ответ

0

Либо вы, serve your CSS-file with PHP. Или вы используете что-то вроде SASS для использования переменных в вашем CSS.

Разбор CSS с помощью PHP и замена переменных с использованием регулярных выражений приведет к 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: это уродливый трюк в порядке, но вместо того, чтобы встраивать PHP в LESS (что, скорее всего, приведет к ошибке компиляции), было бы намного проще создать LESS-файл из PHP. –

+0

Для чего потребуется запустить PHP, а затем запустить меньше, и это пока клиент ждет ... плохая идея – AsTeR

1

Я считаю, что регулярное выражение ваш после такой: body {(([a-zA-Z0-9:;#%\(\)\'\-])*\s*)*} - вам необходимо отформатировать это правильно для многострочных в php.

Вы должны соответствовать каждому символу кроме{ и }, чтобы убедиться, что вы только захватить стиль тела и не все стили.

Я также рекомендую использовать this site для проверки регулярного выражения, прежде чем пытаться его использовать. Я согласен с другими комментариями, я думаю, что твои дела немного сумасшедшие .. но, по словам Нормана Бэйтса, «Мы все иногда немного сумасшедшие», я знаю, что знаю. Надеюсь это поможет.

EDIT:

<?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

Это не работает на многострочном, я полагаю, что метасимвол \ s и 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; оператор if можно альтернативно заменить на/* * /, если вы даже не используете PHP для генерации HTML. –

+0

Ну TMHO это тот же подход – AsTeR

Смежные вопросы