我想解析一个文件,我想使用php和regex去剥离:
基本上我想删除任何包含
的行/* text */
或多行评论
/***
some
text
*****/
如果可能的话,另一个正则表达式来检查该行是否为空(删除空行)
这可能吗?有人可以向我发布正确的正则表达式吗?
非常感谢。
答案 0 :(得分:44)
$text = preg_replace('!/\*.*?\*/!s', '', $text);
$text = preg_replace('/\n\s*\n/', "\n", $text);
答案 1 :(得分:10)
请记住,如果要解析的文件包含包含符合这些条件的字符串,则使用的任何正则表达式都将失败。例如,它会转变:
print "/* a comment */";
进入这个:
print "";
可能不你想要什么。但也许是,我不知道。无论如何,正则表达式在技术上无法以避免该问题的方式解析数据。我在技术上说,因为现代PCRE正则表达已经加入了许多黑客攻击,使他们都能够做到这一点,更重要的是,不再是常规表达式,而是其他任何东西。如果你想避免在引号或其他情况下剥离这些东西,那么完全成熟的解析器是无法替代的(尽管它仍然可以非常简单)。
答案 2 :(得分:5)
// Removes multi-line comments and does not create
// a blank line, also treats white spaces/tabs
$text = preg_replace('!^[ \t]*/\*.*?\*/[ \t]*[\r\n]!s', '', $text);
// Removes single line '//' comments, treats blank characters
$text = preg_replace('![ \t]*//.*[ \t]*[\r\n]!', '', $text);
// Strip blank lines
$text = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $text);
答案 3 :(得分:2)
可能,但我不会这样做。你需要解析整个php文件,以确保你没有删除任何必要的空格(字符串,关键字/标识符之间的空格(publicfuntiondoStuff())等)。更好地使用PHP的tokenizer extension。
答案 4 :(得分:2)
这应该可以将所有/ *替换为* /。
$string = preg_replace('/(\s+)\/\*([^\/]*)\*\/(\s+)/s', "\n", $string);
答案 5 :(得分:2)
$string = preg_replace('#/\*[^*]*\*+([^/][^*]*\*+)*/#', '', $string);
答案 6 :(得分:0)
这是我的解决方案,如果不习惯regexp。以下代码删除由#分隔的所有注释,并以此样式检索变量的值NAME = VALUE
$reg = array();
$handle = @fopen("/etc/chilli/config", "r");
if ($handle) {
while (($buffer = fgets($handle, 4096)) !== false) {
$start = strpos($buffer,"#") ;
$end = strpos($buffer,"\n");
// echo $start.",".$end;
// echo $buffer ."<br>";
if ($start !== false)
$res = substr($buffer,0,$start);
else
$res = $buffer;
$a = explode("=",$res);
if (count($a)>0)
{
if (count($a) == 1 && !empty($a[0]) && trim($a[0])!="")
$reg[ $a[0] ] = "";
else
{
if (!empty($a[0]) && trim($a[0])!="")
$reg[ $a[0] ] = $a[1];
}
}
}
if (!feof($handle)) {
echo "Error: unexpected fgets() fail\n";
}
fclose($handle);
}
答案 7 :(得分:0)
这是一个很好的功能,而且工作!
<?
if (!defined('T_ML_COMMENT')) {
define('T_ML_COMMENT', T_COMMENT);
} else {
define('T_DOC_COMMENT', T_ML_COMMENT);
}
function strip_comments($source) {
$tokens = token_get_all($source);
$ret = "";
foreach ($tokens as $token) {
if (is_string($token)) {
$ret.= $token;
} else {
list($id, $text) = $token;
switch ($id) {
case T_COMMENT:
case T_ML_COMMENT: // we've defined this
case T_DOC_COMMENT: // and this
break;
default:
$ret.= $text;
break;
}
}
}
return trim(str_replace(array('<?','?>'),array('',''),$ret));
}
?>
现在使用此函数'strip_comments'传递某些变量中包含的代码:
<?
$code = "
<?php
/* this is comment */
// this is also a comment
# me too, am also comment
echo "And I am some code...";
?>";
$code = strip_comments($code);
echo htmlspecialchars($code);
?>
将结果输出为
<?
echo "And I am some code...";
?>
从php文件加载:
<?
$code = file_get_contents("some_code_file.php");
$code = strip_comments($code);
echo htmlspecialchars($code);
?>
加载php文件,删除评论并保存回来
<?
$file = "some_code_file.php"
$code = file_get_contents($file);
$code = strip_comments($code);
$f = fopen($file,"w");
fwrite($f,$code);
fclose($f);
?>
答案 8 :(得分:0)
我发现这个更适合我,(\s+)\/\*([^\/]*)\*/\n*
删除了多行,带标签或不带标签的注释以及后面的空格。我将留下一个与此正则表达式匹配的注释示例。
/**
* The AdditionalCategory
* Meta informations extracted from the WSDL
* - minOccurs : 0
* - nillable : true
* @var TestStructAdditionalCategorizationExternalIntegrationCUDListDataContract
*/