Вы можете использовать token_get_all()
, чтобы получить все токены из файла PHP
например,
<?php
$fileStr = file_get_contents('file.php');
foreach (token_get_all($fileStr) as $token) {
if ($token[0] == T_CONSTANT_ENCAPSED_STRING) {
echo "found string {$token[1]}\r\n";
//$token[2] is line number of the string
}
}
Вы могли бы сделать действительно грязную проверку, что он не используется как индекс массива чем-то вроде:
$fileLines = file('file.php');
//inside the loop and if
$line = $fileLines[$token[2] - 1];
if (false === strpos($line, "[{$token[1]}]")) {
//not an array index
}
но вы действительно будете изо всех сил пытаться сделать это должным образом, потому что кто-то, возможно, написал что-то, чего вы, возможно, не ожидаете, например ::
$str = 'string that is not immediately an array index';
doSomething($array[$str]);
Редактировать
Как говорит Ant P, вам, вероятно, было бы лучше искать [
и ]
в окружающих токенах для второй части этого ответа, а не моего strpos
хака, что-то вроде этого:
$i = 0;
$tokens = token_get_all(file_get_contents('file.php'));
$num = count($tokens);
for ($i = 0; $i < $num; $i++) {
$token = $tokens[$i];
if ($token[0] != T_CONSTANT_ENCAPSED_STRING) {
//not a string, ignore
continue;
}
if ($tokens[$i - 1] == '[' && $tokens[$i + 1] == ']') {
//immediately used as an array index, ignore
continue;
}
echo "found string {$token[1]}\r\n";
//$token[2] is line number of the string
}