1 回答
TA贡献1824条经验 获得超6个赞
正如人们已经在评论部分指出的那样:正则表达式可能不是执行此操作的最佳解决方案。不管怎样,你要求它,我在下面的课程中测试了它。
// 1) without class check -> this does not work with code on line with opening {
preg_match('/(?:^{(?!\r?\n?\s*\*\/)|{\s*$(?!\r?\n?\s*\*\/)).+^\s*}(?!\r?\n?\s*\*\/)/ms', $c, $match);
// 2) with class check -> this should always work
preg_match('/^[\s\w]+?(?:{(?!\r?\n?\s*\*\/)|{\s*$(?!\r?\n?\s*\*\/)).+^\s*}(?!\r?\n?\s*\*\/)/ms', $c, $match);
// 3) with class check and capturing the second part (non-class-definition) separately -> this should always work
preg_match('/^[\s\w]+?((?:{(?!\r?\n?\s*\*\/)|{\s*$(?!\r?\n?\s*\*\/)).+^\s*}(?!\r?\n?\s*\*\/))/ms', $c, $match);
我建议使用 3)。
/**
* The LightTaskSchedulerService class. :{
*/
class LightTaskSchedulerService implements TaskSchedulerService {
{
/**
*
* This method IS the task manager.
* See the @page(Light_TaskScheduler conception notes) for more details.
*
*/
public function run()
{
$executionMode = $this->options['executionMode'] ?? "lastOnly";
$this->logDebug("Executing run method with execution mode \"$executionMode\".");
if ($foo) {
doBar($foo);
}
/* multiline */
// simple one line comment
// simple one line comment { }
# another comment
# another comment}} {
# another comment{/*}*/
//}
#}
/*}*/
/*{*/
/*
}*/
/*
}
*/
}
}
// this can happen in comments:}, why
// more stuff
/* multiline hello} hello{
}*/
# singleline{
#}
//}
/*}*/
/**
}*/
输出:
Array
(
[0] => {
{
/**
*
* This method IS the task manager.
* See the @page(Light_TaskScheduler conception notes) for more details.
*
*/
public function run()
{
$executionMode = $this->options['executionMode'] ?? "lastOnly";
$this->logDebug("Executing run method with execution mode \"$executionMode\".");
if ($foo) {
doBar($foo);
}
/* multiline */
// simple one line comment
// simple one line comment { }
# another comment
# another comment}} {
# another comment{/*}*/
//}
#}
/*}*/
/*{*/
/*
}*/
/*
}
*/
}
}
)
您的代码不起作用,因为它有错误:
未知修饰符
g
(forpreg_match
) =>preg_match_all
使用$c
在你的代码中不起作用,因为它不在 php 范围内写:<?php $c = <<<'EEE' ...
相反在你的案例中,后面的外观不起作用,因为你不能使用
+*?
修饰符。
参考:
在php.net上,“g”未列为选项。
修饰符“g”:preg_match_all
我认为你甚至不需要preg_match_all
一个简单的preg_match
应该工作,因为无论如何你只需要这场比赛。
这应该可以工作(用 PHP 7.0.1 测试)。它对我来说:
preg_match('/^class\s+\w+\s*({.+(?<! )})/ms', $c, $match);
// or:
preg_match('/^class[^{]+({.+(?<! )})/ms', $c, $match);
// or even:
preg_match('^{.+\r?\n}(?<! )/ms', $c, $match);
print_r($match);
我的正则表达式中的否定查找后面会检查本例中后面跟着的前导空格}- 在本例中右括号需要位于最左角。这将起作用,除非您希望以不同的方式进行。无论如何,你需要一个分隔符。而且您也不希望 run() 方法中的 if 语句的右大括号结束搜索。
print_r$match上面第一条语句的输出preg_match:
Array
(
[0] => class LightTaskSchedulerService
{
/**
*
* This method IS the task manager.
* See the @page(Light_TaskScheduler conception notes) for more details.
*
*/
public function run()
{
$executionMode = $this->options['executionMode'] ?? "lastOnly";
$this->logDebug("Executing run method with execution mode \"$executionMode\".");
if ($foo) {
doBar($foo);
}
}
}
[1] => {
/**
*
* This method IS the task manager.
* See the @page(Light_TaskScheduler conception notes) for more details.
*
*/
public function run()
{
$executionMode = $this->options['executionMode'] ?? "lastOnly";
$this->logDebug("Executing run method with execution mode \"$executionMode\".");
if ($foo) {
doBar($foo);
}
}
}
)
- 1 回答
- 0 关注
- 142 浏览
添加回答
举报