RegExp:分隔符

时间:2018-03-20 20:24:09

标签: php regex preg-match pcre preg-match-all

考虑以下

use namespace;

class name impl... {

    use Trait;
}

如果我想在课程定义之前或之后提取use,我将如何解决这个问题?在上面的示例中,它很简单,但是如果它也应该在两个地方都有多个use的实际代码文件上工作,甚至可能不会组合在一起,但是其他内容介于两者之间,也适用于所有行chars删除了?

将它们全部搞定是很容易的,但我希望它能够在到达课堂时或从课堂开始时停止。只是不能缝合以使任何东西正常工作。

删除了行,注释和文字,因此不应考虑这些。

2 个答案:

答案 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一起使用,其中包含每场比赛的偏移量。

现在简单地将每个偏移量与开头提取的偏移量进行比较。如果它更低,它是一个参考条款。如果它更高,那就是特质条款。