E 'possibile mostrare i numeri di riga quando si utilizza una regex in PHP?
-
01-10-2019 - |
Domanda
E 'possibile avere un'espressione regolare che è alla ricerca di una stringa come '\ bfunction \ b' che visualizzerà il numero di linea dove ha trovato la partita?
Soluzione
I suggerirà qualcosa che lavoro potrebbe per voi,
// 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
}
Altri suggerimenti
Non c'è modo semplice per farlo, ma se si volesse, si potrebbe catturare l'offset match (utilizzando il flag PREG_OFFSET_CAPTURE
per preg_match
o preg_match_all
) e quindi determinare quale linea che la posizione è nella stringa per il conteggio di quanti a capo (per esempio) si verificano prima di quel punto.
Ad esempio:
$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.
A seconda di ciò che costituisce una "linea" nella vostra applicazione, si potrebbe alternativamente voler cercare \r\n
o <br>
(ma che sarebbe un po 'più complicato, perché si avrebbe dovuto utilizzare un altro regex per conto di <br />
o <br style="...">
, ecc.).
Per quanto ne so che non è, ma se siete su Linux o qualche altro Unix-like sistema, grep
lo farà e può usare (quasi) la stessa sintassi delle espressioni regolari come la famiglia preg_
di funzioni con l'-P
bandiera.
No. È possibile passare il flag PREG_OFFSET_CAPTURE a preg_match, strega vi dirà l'offset in byte. Tuttavia, non v'è alcun modo semplice per convertire questo per un numero di riga.
Non si tratta di espressioni regolari, ma funziona:
$offset = strpos($code, 'function');
$lines = explode("\n", substr($code, 0, $offset));
$the_line = count($lines);
Opps! Questo non è js!