Est-il possible de montrer les numéros de ligne lors de l'utilisation d'une expression rationnelle en PHP?

StackOverflow https://stackoverflow.com/questions/3560640

  •  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?

Était-ce utile?

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.

Non

. 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!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top