2016-10-21 139 views
1

有人能告訴我,爲什麼下面的preg_match搜索的工作原理:PHP - 的preg_match失敗

preg_match("/\xF0\x49\xF7\xF8..\xF3\xF8/s", $bin, $matches2, PREG_OFFSET_CAPTURE); 

,而這並不給出任何結果:

preg_match("/\x3F.\x0D\x01\x3E.\xF3\xFA..\x43\xFA.\x04\xFD\x02/s", $bin, $matches, PREG_OFFSET_CAPTURE); 

兩種可能性都在裏面$箱。

進一步的問題:

什麼是搜索以下位置,其中XX是變量,可以是任何東西在$ bin文件(1個匹配或以上)的最好辦法,至少我需要開始每場比賽的位置。

我需要尋找這樣的:

3F XX 0D 01 3E XX F3 FA XX XX 43 FA XX 04 FD 02 

例子匹配:

**4 example matches** 
1) 3F 64 0D 01 3E 64 F3 FA 86 F8 43 FA E1 04 FD 02 
2) 3F 5C 0D 01 3E 5C F3 FA 9C F8 43 FA B6 04 FD 02 
3) 3F 5B 0D 01 3E 5B F3 FA 9A F8 43 FA 69 04 FD 02 
4) 3F 6B 0D 01 3E 6B F3 FA 78 F8 43 FA 38 04 FD 02 

我可以在$ bin包含原始二進制一個$ bin文件搜索,或將其轉換像BIN2HEX($ bin),..

現在我發現了這種方式,它似乎工作,但是,這是一個「很好」和快速的方式來做到這一點?我現在已經在腳本中分配了300MB以上的ram,並且希望它使資源更友好一些。

preg_match_all("/3F[A-Z0-9]{2}0D013E[A-Z0-9]{2}F3FA[A-Z0-9]{4}43FA[A-Z0-9]{2}04FD02/", $binhex, $matches, PREG_OFFSET_CAPTURE); 

回答

1

您的最新正則表達式缺少幾個空格,並且{4}組不符合您的樣本。更正後,它看起來像這樣: 3F [A-F\d]{2} 0D 01 3E [A-F\d]{2} F3 FA [A-F\d]{2} [A-F\d]{2} 43 FA [A-F\d]{2} 04 FD 02這運行在172steps這是沒有什麼可失望的。

當選擇爲您的項目正確的正則表達式模式,最好是整個識別您的工作重點:

  1. 圖案簡潔&可讀性 - 更值得關注的,如果在一個團隊中工作或經常更新。

  2. 模式速度/步驟 - 當處理大量數據時肯定會擔心。

  3. 模式驗證實力 - 開發人員有責任瞭解必要的內容。

讓我們考慮一些我準備的選項(還有更多,正則表達式是兔子洞)。

(?:.. ?){16} 272steps這個優先圖案簡潔起見,在驗證的強度和速度的很大的成本

(?:[A-F\d]{2} ?){16} 208steps這個優先簡潔起見,具有略微改進的驗證和速度

3F \d[A-F\d] 0D 01 3E \d[A-F\d] F3 FA \d[A-F\d] F8 43 FA [A-F\d]\d 04 FD 02 192step小號這是非常字面並優先驗證,與圖案的長度和速度的成本

3F [A-F\d]{2} 0D 01 3E [A-F\d]{2} F3 FA [A-F\d]{2} [A-F\d]{2} 43 FA [A-F\d]{2} 04 FD 02 172steps量詞{2}增加速度,但對驗證有輕微的影響,因爲擴大字符範圍在每對

[A-F\d]{2} [A-F\d]{2} [A-F\d]{2} [A-F\d]{2} [A-F\d]{2} [A-F\d]{2} [A-F\d]{2} [A-F\d]{2} [A-F\d]{2} [A-F\d]{2} [A-F\d]{2} [A-F\d]{2} [A-F\d]{2} [A-F\d]{2} [A-F\d]{2} [A-F\d]{2}135steps這是最大的合理的折衷速度優先的情況下,圖案簡潔和驗證強度在很大程度上影響

[A-F\d ]{47}12steps:_if驗證只需要從惡意字符串來保護而不是檢查字符串的質量,這可能是在旅途中。

然後再次,如果您對驗證的需求是這麼低,那麼可能要避免所有費用都在regex/preg_match_all之間。也許使用str_split($str,49)或類似的。

所以這個決定完全是你的,但最好有幾個選項來比較和對比。

每當您對某個正則表達式模式有疑問或疑問時,請轉至regex101.com投擲一些示例數據並使用少數正則表達式模式進行遊戲。該頁面將顯示錯誤,步驟/速度和捕獲的數據 - 這非常方便。

+0

謝謝@mickmackusa!對不起,我沒有看到它,因爲我忘了問題。 非常感謝這真的很好的答案。 –