¿Es posible mostrar los números de línea cuando se utiliza una expresión regular en PHP?
-
01-10-2019 - |
Pregunta
¿Es posible tener una expresión regular que está en busca de una cadena como '\ bfunction \ b' que mostrará el número de línea donde se encuentra la coincidencia?
Solución
Me sugerirá algo que la fuerza de trabajo para usted,
// 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
}
Otros consejos
No hay forma sencilla de hacerlo, pero si quisiera, podría capturar el desplazamiento partido (usando la bandera PREG_OFFSET_CAPTURE
para preg_match
o preg_match_all
) y luego determinar qué línea que la ubicación es en la cadena mediante recuento de cuántos saltos de línea (por ejemplo) se producen antes de ese punto.
Por ejemplo:
$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.
En función de lo que constituye una "línea" en su aplicación, es posible alternativamente que desee buscar \r\n
o <br>
(pero eso sería un poco más complejo, ya que tendría que utilizar otra expresión regular para dar cuenta de <br />
o <br style="...">
, etc.).
Por lo que yo sé que no es, pero si estás en Linux o algún otro tipo Unix sistema, grep
hará eso y se puede utilizar (casi) la misma sintaxis de expresiones regulares como la familia preg_
de funciones con el -P
bandera.
No. Puede pasar el indicador PREG_OFFSET_CAPTURE a preg_match, bruja le dirá el desplazamiento en bytes. Sin embargo, no hay una manera fácil de convertir a un número de línea.
Esto no es expresión regular, pero las obras:
$offset = strpos($code, 'function');
$lines = explode("\n", substr($code, 0, $offset));
$the_line = count($lines);
Opps! Esto no es js!