PHP RegEx: Как разделить пробелы между двумя строками - PullRequest
0 голосов
/ 19 марта 2010

Я пытался написать регулярное выражение, которое удалит пробел после точки с запятой (';'), когда он находится между открытой и закрытой фигурной скобкой ('{', '}'). Я получил где-то, но не смог осуществить это. Вот что у меня есть:

<?php
 $output = '@import url("/home/style/nav.css");
body{color:#777;
 background:#222 url("/home/style/nav.css") top center no-repeat;
 line-height:23px;
 font-family:Arial,Times,serif;
 font-size:13px}'
 $output = preg_replace("#({.*;) \s* (.*[^;]})#x", "$1$2", $output);
?>

Вывод $ должен быть следующим. Также обратите внимание, что за первой точкой с запятой в строке все еще следует пробел, как и должно быть.

<?php
 $output = '@import url("/home/style/nav.css");
body{color:#777;background:#222 url("/home/style/nav.css") top center no-repeat;line-height:23px;font-family:Arial,Times,serif;font-size:13px}';
?>

Спасибо! Заранее всем, кто готов дать ему шанс.

Ответы [ 2 ]

1 голос
/ 19 марта 2010

Regex - плохой инструмент для этой работы, потому что CSS не является обычным языком . Вы сталкиваетесь с пробелами в значениях свойств, как вы знаете. Регексы не понимают таких контекстов.

Я предполагаю, что вы пытаетесь минимизировать свой CSS. Для этого есть инструменты. Я бы предложил использовать их. Либо так, либо получите библиотеку, которая анализирует CSS и может вывести его с минимальным пробелом.

Если вы настаиваете на том, чтобы идти по маршруту регулярных выражений, возможно, попробуйте Потрясающе простой CSS Minifier .

0 голосов
/ 19 марта 2010

Вам нужно сначала найти совпадение (строка между {}), а затем поработать с ним. Функция preg_replace_callback () должна помочь вам:

function replace_spaces($str){
        $output = preg_replace('/(;[[:space:]]+)/s', ';', $str[0]);
        return $output;
}

 $output = '@import url("/home/style/nav.css");
body{color:#777;
 background:#222 url("/home/style/nav.css") top center no-repeat;
 line-height:23px;
 font-family:Arial,Times,serif;
 font-size:13px}';
 $out = preg_replace_callback("/{(.*)}/s", 'replace_spaces', $output);

Возможно, вам придется настроить это для нескольких матчей.

...