php - php從preg_match_all獲取行號( )

  显示原文与译文双语对照的内容
72 2

我使用php的preg_match_all() 搜索使用 file_get_contents() 導入的字元串。 正規表達式 返回匹配項,但我想知道這些匹配的行號在哪。 最好的技術是什麼?

我可以將文件作為 array 讀取並執行每行的正規表達式,但問題是我的正規表達式 與回車表的結果匹配。

时间: 原作者:

148 4

現在有點晚了,也許你會解決這個問題,但是我必須做它,但是相當簡單。 在 preg_match 中使用 PREG_OFFSET_CAPTURE 標誌將返回匹配的字元位置。 讓我們假定 $charpos, 如此


list($before) = str_split($content, $charpos);//fetches all the text before the match



$line_number = strlen($before) - strlen(str_replace("n","", $before)) + 1;



瞧!

原作者:
129 3

你不能用regexs做這個。 至少不乾淨。你可以使用 PREG_OFFSET_CAPTURE 標誌進行整個文件的分析。

如果在文件的起始位置和每個字元串的起始偏移量之間有字元串,那麼每個字元串的起始位置和偏移量之間就會有多少或者 n 或者 r 。 匹配的行號將是不同的EOL終止符( rn | n | r ) 加 1的數目。

125 2

你有幾個選擇,但沒有"簡單":

a ) exec() 並使用系統 grep 命令,該命令可以報告行號:


exec("grep -n 'your pattern here' file.txt", $output);`



b ) 在文件中使用 file_get_contents(),將它拆分成一個行的array,然後使用 preg_grep() 查找匹配的行。


$dat = file_get_contents('file.txt');


$lines = explode($dat,"n");


$matches = preg_grep('/your pattern here/', $lines);



c ) 按行大小讀取文件,保持運行行數,並在每行上執行 Pattern 匹配。


$fh = fopen('file.txt', 'rb');


$line = 1;


while ($line = fgets($fh)) {


 if (preg_match('/your pattern here/', $line)) {


. . . whatever you need to do with matching lines.. .


 }


 $line++;


}



每個都有自己的ups

你正在調用外部程序,如果你的Pattern 包含任何用戶提供的數據,你可以能將自己打開 shell 。 在另一方面,你不必在整個文件中進行 sip,並且將節省一些內存開銷。

從 shell 注入攻擊中你是安全的,但是你必須在整個文件中加入。 如果文件很大,可能會耗盡可用內存。

c ) 每行調用一個 正規表達式,如果處理大量行,則會有顯著的開銷。

...