Можно ли показывать номера строк при использовании регулярного выражения в PHP?
-
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!