Ist es möglich, Zeilennummern zu zeigen, wenn eine Regex in PHP?
-
01-10-2019 - |
Frage
Ist es möglich, einen regulären Ausdruck zu haben, die für eine Zeichenfolge sucht wie ‚\ bFunction \ b‘, die die Zeilennummer angezeigt werden, wo es die Übereinstimmung gefunden?
Lösung
Ich werde etwas vorschlagen, das könnte für Sie arbeiten,
// 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
}
Andere Tipps
Es gibt keinen einfachen Weg, es zu tun, aber wenn man will, könnte man das Spiel erfassen Offset (mit der PREG_OFFSET_CAPTURE
Flagge preg_match
oder preg_match_all
) und dann bestimmen, welche Linie der Position in der Zeichenfolge durch Zählen, wie viele neue Zeilen (zum Beispiel) auftreten vor diesem Punkt.
Zum Beispiel:
$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.
Je nachdem, was eine „Linie“ in Ihrer Anwendung, können Sie abwechselnd für \r\n
oder <br>
suchen möchten (aber das wäre ein wenig komplizierter, weil Sie einen anderen Regex Konto für <br />
oder <br style="...">
verwenden müssten, etc.).
So weit ich es weiß nicht, aber wenn Sie auf Linux oder ein anderes Unix-ähnliches System wird grep
das tun und nutzen können (fast) die gleiche Syntax für reguläre Ausdrücke wie die preg_
Familie von Funktionen mit dem -P
Flagge.
Nein. Sie können die PREG_OFFSET_CAPTURE Flagge zu preg_match passieren, Hexe werden Sie in Bytes der Offset sagen. Allerdings gibt es keine einfache Möglichkeit, dies zu einer Zeilennummer zu konvertieren.
Dies ist nicht regex, aber funktioniert:
$offset = strpos($code, 'function');
$lines = explode("\n", substr($code, 0, $offset));
$the_line = count($lines);
Upps! Dies ist nicht js!