regex preg_replace out CSS注解?

5vf7fwbs  于 2022-11-26  发布在  其他
关注(0)|答案(5)|浏览(144)

我正在写一个快速的preg_replace来从CSS中剥离注解。CSS注解通常有这样的语法:

/* Development Classes*/
/* Un-comment me for easy testing
  (will make it simpler to see errors) */

所以我试着把/* 和 */之间的所有字符去掉,就像这样:

$pattern = "#/\*[^(\*/)]*\*/#";
$replace = "";
$v = preg_replace($pattern, $replace, $v);

不行!它似乎被正斜杠卡住了,因为如果我把/s从模式中去掉,我可以让它删除注解文本。我尝试了一些更简单的模式,看看我是否可以去掉斜杠,但它们返回的是原始字符串:

$pattern = "#/#";
$pattern = "/\//";

你知道为什么我看起来和那些斜线不一样吗?谢谢!

5w9g7ksd

5w9g7ksd1#

这里有一个解决方案:

$regex = array(
"`^([\t\s]+)`ism"=>'',
"`^\/\*(.+?)\*\/`ism"=>"",
"`([\n\A;]+)\/\*(.+?)\*\/`ism"=>"$1",
"`([\n\A;\s]+)//(.+?)[\n\r]`ism"=>"$1\n",
"`(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+`ism"=>"\n"
);
$buffer = preg_replace(array_keys($regex),$regex,$buffer);

取自Samstyle PHP Framework中的脚本/样式表预处理器
请参阅:http://code.google.com/p/samstyle-php-framework/source/browse/trunk/sp.php
csstest.php:

<?php

$buffer = file_get_contents('test.css');

$regex = array(
"`^([\t\s]+)`ism"=>'',
"`^\/\*(.+?)\*\/`ism"=>"",
"`([\n\A;]+)\/\*(.+?)\*\/`ism"=>"$1",
"`([\n\A;\s]+)//(.+?)[\n\r]`ism"=>"$1\n",
"`(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+`ism"=>"\n"
);
$buffer = preg_replace(array_keys($regex),$regex,$buffer);
echo $buffer;

?>

test.css:

/* testing to remove this */
.test{}

php的输出:

.test{}
vsdwdz23

vsdwdz232#

我不相信你可以在一个否定的字符类中使用分组,你要使用的是Assertions,它有两种类型,“look-ahead”和“look-behind”。
你要找的英语模式基本上是“forward slash, literal wildcard, anything that isn't followed by a forward slash or anything other than a literal wildcard that is followed by a forward slash or a forward slash that isn't preceded by a literal wildcard zero or more times, literal wild card, forward slash

<?php

$str = '/* one */ onemore
/*
* a
* b
**/
stuff // single line
/**/';

preg_match_all('#/\*(?:.(?!/)|[^\*](?=/)|(?<!\*)/)*\*/#s', $str, $matches);
print_r($matches);

?>
ekqde3dh

ekqde3dh3#

为了解决这个问题,我首先简化了代码,用不同的标识符替换“/ASTERIX”和“ASTERIX/”,然后用它们作为开始和结束标记。

$code = str_replace("/*","_COMSTART",$code);
$code = str_replace("*/","COMEND_",$code);
$code = preg_replace("/_COMSTART.*?COMEND_/s","",$code);

s标志指示搜索到新的行

yhqotfr8

yhqotfr84#

只是为了好玩(当然也是小项目),我制作了这样一个代码的非正则表达式版本(我希望它更快):

function removeCommentFromCss( $textContent )
{
    $clearText = "";
    $charsInCss = strlen( $textContent );
    $searchForStart = true;
    for( $index = 0; $index < $charsInCss; $index++ )
    {
        if ( $searchForStart )
        {
            if ( $textContent[ $index ] == "/" && (( $index + 1 ) < $charsInCss ) && $textContent[ $index + 1 ] == "*" )
            {
                $searchForStart = false;
                continue;
            }
            else
            {
                $clearText .= $textContent[ $index ];
            }
        }
        else
        {
            if ( $textContent[ $index ] == "*" && (( $index + 1 ) < $charsInCss ) && $textContent[ $index + 1 ] == "/" )
            {
                $searchForStart = true;
                $index++;
                continue;
            }
        }
    }
    return $clearText;
}
piok6c0g

piok6c0g5#

有很多建议,但这一条似乎对我有用:

$v=preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $v);

所以

"/* abc */.test { color:white; } /* XYZ */.test2 { padding:1px; /* DEF */} /* QWERTY */"

给予

.test { color:white; } .test2 { padding:1px; }

工作试验见https://onlinephp.io/c/2ae1c

相关问题