【问题标题】:PHP - get line number of regex resultPHP - 获取正则表达式结果的行号
【发布时间】:2025-12-10 01:25:01
【问题描述】:

我正在尝试编写一些 PHP 来读取 CSS 文件,查找所有出现的 @group 注释及其行号。这是我目前所拥有的,但它返回的是字符数而不是行号。

$file = 'master.css';
$string = file_get_contents($file);

$matches = array();
preg_match_all('/\/\* @group.*?\*\//m', $string, $matches, PREG_OFFSET_CAPTURE);
list($capture, $offset) = $matches[0];
$line_number = substr_count(substr($string, 0, $offset), "\n") + 1;

echo '<pre>';
print_r($matches[0]);
echo '</pre>';

【问题讨论】:

    标签: php css regex arrays


    【解决方案1】:

    尝试使用file() 而不是file_get_contents()。不同之处在于file() 将文件内容作为数组返回,每行一个元素,而不是像file_get_contents 那样作为字符串返回。我应该注意到file() 在每行末尾返回换行符作为数组元素的一部分。如果您不希望这样,请添加 FILE_IGNORE_NEW_LINES 标志作为第二个参数。

    从那里,您可以使用preg_grep() 仅返回初始数组中的元素。如果您只需要行号,则可以读取它们的索引以确定哪些行匹配:

    一个例子:

    myfile.txt:

    hello world
    how are you
    say hello back!
    

    line_find.php:

    $filename = "myfile.txt";
    $fileContents = file($filename);
    
    $pattern = "/hello/";
    $linesFound = preg_grep($pattern, $fileContents);
    
    echo "<pre>", print_r($linesFound, true), "</pre>";
    

    结果:

    Array
    (
        [0] => hello world
    
        [2] => say hello back!
    )
    

    希望对您有所帮助。

    【讨论】:

    • 这是一个很好的解决方案...我总是忘记preg_grep()。但是,如果他想支持跨多行的 cmets,这将行不通。 (但如果他知道他的文件是如何格式化的,那么技术性可能并不重要。)
    • @konforce 如果 OP 需要支持多行,您的解决方案也将不起作用。我也想不出办法来解决这个问题。
    • 我很确定他是否要围绕他正在寻找的确切单词进行匹配组,PHP 也会为他提供该索引(re: preg_match)。
    • 感谢@AgentConundrum。这一直让我发疯。你的回答肯定让我更接近我的最终结果。我从来没有听说过preg_grep()。不错。
    • @simplethemes 不客气。 PHP 有各种人们忘记存在的繁琐的小函数。
    【解决方案2】:

    这不会是最优的,但如果你不关心这个:

    $line_number = 1 + substr_count($string, "\n", 0, $index);
    

    它只是计算在您从偏移捕获中获得该索引之前找到的换行符的数量。

    【讨论】: