考虑以下
use namespace;
class name impl... {
use Trait;
}
如果我想在课程定义之前或之后提取use
,我将如何解决这个问题?在上面的示例中,它很简单,但是如果它也应该在两个地方都有多个use
的实际代码文件上工作,甚至可能不会组合在一起,但是其他内容介于两者之间,也适用于所有行chars删除了?
将它们全部搞定是很容易的,但我希望它能够在到达课堂时或从课堂开始时停止。只是不能缝合以使任何东西正常工作。
删除了行,注释和文字,因此不应考虑这些。
答案 0 :(得分:0)
为了检测最外层范围内发生的use
子句,您需要删除{...}
的所有(嵌套)块。您无法在单个表达式中执行此操作(由于深度不受限制),但如果您需要,可以在循环中应用块删除:
$s = <your code>;
$prev_s = "";
while ($s != $prev_s) {
$prev_s = $s;
$s = preg_replace('\{[^}]*\}','',$s);
}
现在您可以收集外部使用条款
$outer_uses = preg_match_all('\buse\s+(\w+)', $s);
答案 1 :(得分:0)
删除块也不错,但我需要全部获取它们,包括内部范围中的那些,我只需要知道哪个是哪个。
对于单个RegExp来说,这显然要处理,所以这就是我所做的。以防万一其他人正在寻找答案。
使用某些东西来定位类声明的偏移起始位置。
replaced with its corresponding FULL DESCRIPTION
结合/\b(class|interface|trait)\s+[\w]+.*{/s
及其preg_match
标志将为您提供偏移量。
然后提取所有PREG_OFFSET_CAPTURE
子句,内部和外部范围。
use
使用/\buse\s+(?<full>([\w\\\]+(?:\s+as\s+[\w]+)?(?:\s*[,]\s*)?)+)(?:(?<=[\\\]){(?<inline>.*)})?\s*[;{]/
与preg_match_all
一起使用,其中包含每场比赛的偏移量。
现在简单地将每个偏移量与开头提取的偏移量进行比较。如果它更低,它是一个参考条款。如果它更高,那就是特质条款。