Dou*_*ery 6 php regex preg-replace
我正在编写一个快速preg_replace来从CSS中删除注释.CSS注释通常具有以下语法:
/* Development Classes*/
/* Un-comment me for easy testing
(will make it simpler to see errors) */
Run Code Online (Sandbox Code Playgroud)
所以我试图杀死/*和*/之间的所有内容,如下所示:
$pattern = "#/\*[^(\*/)]*\*/#";
$replace = "";
$v = preg_replace($pattern, $replace, $v);
Run Code Online (Sandbox Code Playgroud)
没有骰子!它似乎在正斜杠上窒息,因为如果我将/ s取出模式,我可以删除注释文本.我尝试了一些更简单的模式,看看我是否可以丢失斜杠,但它们会保持原始字符串不变:
$pattern = "#/#";
$pattern = "/\//";
Run Code Online (Sandbox Code Playgroud)
关于为什么我似乎无法匹配那些斜杠的任何想法?谢谢!
mau*_*ris 13
这是一个解决方案:
$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);
Run Code Online (Sandbox Code Playgroud)
摘自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;
?>
Run Code Online (Sandbox Code Playgroud)
test.css:
/* testing to remove this */
.test{}
Run Code Online (Sandbox Code Playgroud)
输出csstest.php:
.test{}
Run Code Online (Sandbox Code Playgroud)
我不相信你可以在一个否定的角色类中使用分组,就像你在那里一样.您想要使用的是Assertions,其中有两种类型."向前看"和"向后看".
你用英语寻找的模式基本上是" 正斜杠,字面的通配符,任何没有正斜杠或任何除了字面通配符之后的东西,后面跟着正斜杠或者正斜线" t前面有一个文字通配符零次或多次,字面外卡,正斜杠 "
<?php
$str = '/* one */ onemore
/*
* a
* b
**/
stuff // single line
/**/';
preg_match_all('#/\*(?:.(?!/)|[^\*](?=/)|(?<!\*)/)*\*/#s', $str, $matches);
print_r($matches);
?>
Run Code Online (Sandbox Code Playgroud)
我遇到过同样的问题。为了解决这个问题,我首先通过用不同的标识符替换“/ASTERIX”和“ASTERIX/”来简化代码,然后将它们用作开始和结束标记。
$code = str_replace("/*","_COMSTART",$code);
$code = str_replace("*/","COMEND_",$code);
$code = preg_replace("/_COMSTART.*?COMEND_/s","",$code);
Run Code Online (Sandbox Code Playgroud)
/s 标志告诉搜索进入新行