Можно ли показывать номера строк при использовании регулярного выражения в PHP?

StackOverflow https://stackoverflow.com/questions/3560640

  •  01-10-2019
  •  | 
  •  

Вопрос

Возможно ли иметь регулярное выражение, которое ищет строку типа «\bfunction\b», которая будет отображать номер строки, в которой найдено совпадение?

Это было полезно?

Решение

Я предложу то, что может сработать для вас,

// Get a file into an array.  In this example we'll go through HTTP to get
// the HTML source of a URL.
$lines = file('http://www.example.com/');

// Loop through our array, show HTML source as HTML source; and line numbers too.
foreach ($lines as $line_num => $line) {
    // do the regular expression or sub string search here
}

Другие советы

Не существует простого способа сделать это, но если вы хотите, вы можете зафиксировать смещение совпадения (используя PREG_OFFSET_CAPTURE флаг для preg_match или preg_match_all), а затем определите, в какой строке находится это место в вашей строке, подсчитав, сколько новых строк (например) встречается до этой точки.

Например:

$matches = array();
preg_match('/\bfunction\b/', $string, $matches, PREG_OFFSET_CAPTURE);
list($capture, $offset) = $matches[0];
$line_number = substr_count(substr($string, 0, $offset), "\n") + 1; // 1st line would have 0 \n's, etc.

В зависимости от того, что представляет собой «строка» в вашем приложении, вы можете поочередно искать \r\n или <br> (но это будет немного сложнее, потому что вам придется использовать другое регулярное выражение для учета <br /> или <br style="...">, и т. д.).

Насколько я знаю, это не так, но если вы используете Linux или другую Unix-подобную систему, grep сделает это и может использовать (почти) тот же синтаксис регулярных выражений, что и preg_ семейство функций с -P флаг.

Нет.Вы можете передать флаг PREG_OFFSET_CAPTURE функции preg_match, которая сообщит вам смещение в байтах.Однако нет простого способа преобразовать это в номер строки.

Это не регулярное выражение, но работает:

$offset = strpos($code, 'function');
$lines = explode("\n", substr($code, 0, $offset));
$the_line = count($lines);

Упс!Это не js!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top