PHP - preg_match 失败
PHP - preg_match fail
有人能告诉我为什么以下 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);
两种可能性都在$bin 中。
进一步问题:
搜索以下位置的最佳方法是什么,其中 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),..
我现在发现了这种方法,它似乎有效,但是,这是一种 "nice" 并且快速的方法吗?我现在已经在我的脚本中分配了超过 300MB 的内存,并希望它能使资源更友好一些。
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);
您最新的正则表达式缺少几个空格,{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 运行,这没什么好失望的。
为您的项目选择正确的正则表达式模式时,最好确定您的优先级:
模式简洁性和可读性 - 如果在团队中工作或经常更新,则更需要关注。
模式Speed/Steps——在处理大量数据时肯定是个问题。
模式验证强度 -- 开发人员有责任了解什么是必要的。
让我们考虑一下我准备的几个选项(还有更多,正则表达式是一个兔子洞)。
(?:.. ?){16}
272 步:这优先考虑模式的简洁性,但代价是验证强度和速度
(?:[A-F\d]{2} ?){16}
208 步:这优先考虑简洁性,验证和速度略有改进
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
192steps:这是非常直白的,优先验证,模式长度和速度都有成本
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
172 步:量词 {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}
135 步:这是在优先考虑速度、模式简洁性和验证强度方面受到很大影响的最大明智权衡
[A-F\d ]{47}
12steps:_如果验证只需要防止恶意字符串而不是检查字符串质量,这可能是可行的。
话又说回来,如果您对验证的要求这么低,那么或许可以避免 regex
/preg_match_all
的开销。也许使用 str_split($str,49)
或类似的。
所以决定权完全在于你,但最好有几个选项来比较和对比。
每当您对正则表达式模式有疑问或疑虑时,请转到 regex101.com 投入一些示例数据并尝试使用一些正则表达式模式。该页面将向您显示错误、steps/speed 和捕获的数据 -- 这非常方便。
有人能告诉我为什么以下 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);
两种可能性都在$bin 中。
进一步问题:
搜索以下位置的最佳方法是什么,其中 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),..
我现在发现了这种方法,它似乎有效,但是,这是一种 "nice" 并且快速的方法吗?我现在已经在我的脚本中分配了超过 300MB 的内存,并希望它能使资源更友好一些。
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);
您最新的正则表达式缺少几个空格,{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 运行,这没什么好失望的。
为您的项目选择正确的正则表达式模式时,最好确定您的优先级:
模式简洁性和可读性 - 如果在团队中工作或经常更新,则更需要关注。
模式Speed/Steps——在处理大量数据时肯定是个问题。
模式验证强度 -- 开发人员有责任了解什么是必要的。
让我们考虑一下我准备的几个选项(还有更多,正则表达式是一个兔子洞)。
(?:.. ?){16}
272 步:这优先考虑模式的简洁性,但代价是验证强度和速度
(?:[A-F\d]{2} ?){16}
208 步:这优先考虑简洁性,验证和速度略有改进
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
192steps:这是非常直白的,优先验证,模式长度和速度都有成本
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
172 步:量词 {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}
135 步:这是在优先考虑速度、模式简洁性和验证强度方面受到很大影响的最大明智权衡
[A-F\d ]{47}
12steps:_如果验证只需要防止恶意字符串而不是检查字符串质量,这可能是可行的。
话又说回来,如果您对验证的要求这么低,那么或许可以避免 regex
/preg_match_all
的开销。也许使用 str_split($str,49)
或类似的。
所以决定权完全在于你,但最好有几个选项来比较和对比。
每当您对正则表达式模式有疑问或疑虑时,请转到 regex101.com 投入一些示例数据并尝试使用一些正则表达式模式。该页面将向您显示错误、steps/speed 和捕获的数据 -- 这非常方便。