Est-il possible de montrer les numéros de ligne lors de l'utilisation d'une expression rationnelle en PHP?
-
01-10-2019 - |
Question
Est-il possible d'avoir une expression régulière qui est à la recherche d'une chaîne comme « \ bfunction \ b » qui affiche le numéro de ligne où il a trouvé le match?
La solution
Je vais suggérer quelque chose qui pourrait fonctionner pour vous,
// 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
}
Autres conseils
Il n'y a aucun moyen simple de le faire, mais si vous vouliez, vous pouvez saisir le décalage de match (en utilisant le drapeau PREG_OFFSET_CAPTURE
pour preg_match
ou preg_match_all
) puis déterminer la ligne que l'emplacement est dans votre chaîne en comptant le nombre de sauts de ligne (par exemple) se produisent avant ce point.
Par exemple:
$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 fonction de ce qui constitue une « ligne » dans votre application, vous pouvez alternativement vouloir rechercher \r\n
ou <br>
(mais ce serait un peu plus compliqué parce que vous auriez à utiliser une autre expression rationnelle compte pour <br />
ou <br style="...">
, etc.).
Pour autant que je sais que ce n'est pas, mais si vous êtes sous Linux ou un autre système Unix, grep
va le faire et peut utiliser (presque) la même syntaxe d'expression régulière que la famille preg_
des fonctions avec le -P
drapeau.
. Vous pouvez passer le drapeau PREG_OFFSET_CAPTURE à preg_match, sorcière vous dira le décalage en octets. Cependant, il n'y a pas moyen facile de convertir à un numéro de ligne.
Ce n'est pas regex, mais des œuvres:
$offset = strpos($code, 'function');
$lines = explode("\n", substr($code, 0, $offset));
$the_line = count($lines);
Opps! Ce n'est pas js!