我正在嘗試讀取我所有的專案檔案,它的內容是檢測一些字串。
我現在有一段作業代碼,但有一些缺失的部分。
目標是掃描我的所有檔案并將一些專案添加到資料庫中,如果它們出現在掃描的檔案中。
例如;
我有一些這樣的代碼:
@can('event-tools::menu.view')那么它應該event-tools::menu.view作為“找到的字串”回傳。
我也有類似的東西$this->middleware('can:access registration check');,那么它也應該檢測到access registration check
我目前使用正則運算式來掃描檔案內容,如下所示:
[^\w](@can|hasPermissionTo|hasDirectPermission)\(\s*(?P<quote>['"])(?P<string>(?:\\k{quote}|(?!\k{quote}).)*)\k{quote}\s*[\),]
任何人都可以幫助解決這個問題?或者如果我應該使用另一種方法?
我使用以下方法檢查匹配項:
preg_match_all("/$stringPattern/siU", $fileContents, $matches)
uj5u.com熱心網友回復:
您可以使用分支重置組,并使用具有相同命名組的交替來匹配 2 種不同的格式。
(?|(?:@can|hasPermissionTo|hasDirectPermission)\(\s*(?P<quote>['"])(?P<string>.*?)\1\)|\((?P<quote>['"])can:(?P<string>.*?)\1\)|\(\[[^][]*(?P<quote>['"])can:(?P<string>.*?)\1[^][]*]\))
部分模式,|對 3 種不同的變化使用 2 次更改:
(?|分支重置組(?:@can|hasPermissionTo|hasDirectPermission)匹配 1 個備選方案\(\s*匹配(和可選的空白字符(?P<quote>['"])匹配'或"在組報價(?P<string>.*?)\1組字串匹配盡可能少的字符,直到組引號中捕獲的相同引號\)比賽)|或者\(比賽((?P<quote>['"])- 和之前一樣can:逐字匹配(或對多個單詞再次使用交替)(?P<string>.*?)\1- 和之前一樣\)比賽)|或者\(\[比賽([[^][]*匹配除[and之外的任何字符](?P<quote>['"])和之前一樣can:從字面上匹配(?P<string>.*?)\1和之前一樣[^][]*]\)匹配除[]使用否定字符類之外的任何字符,然后匹配])
)關閉分支重置組
查看正則運算式演示。
$re = '/(?|(?:@can|hasPermissionTo|hasDirectPermission)\(\s*(?P<quote>[\'"])(?P<string>.*?)\1\)|\((?P<quote>[\'"])can:(?P<string>.*?)\1\)|\(\[[^][]*(?P<quote>[\'"])can:(?P<string>.*?)\1[^][]*]\))/';
$str = <<<'STR'
@can('event-tools::menu.view')
$this->middleware('can:access registration check');
Route::prefix('administration')->middleware(['auth', 'verified', 'can:access admin area'])->group(static function () {
STR;
$result = preg_match_all($re, $str, $matches);
print_r($matches["string"]);
輸出
Array
(
[0] => event-tools::menu.view
[1] => access registration check
[2] => access admin area
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/420840.html
標籤:
下一篇:按期間分組的滾動總和
