我有一个循环,有时包含以下数据:
b"\x01\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00X\x1D›¿\x04\x04›?‹„\x12¿Ã’\x11?"
当我将其放入regex101中时,可以使用以下正则表达式来匹配项目:
/((\\x[\d]{2}){4,}.*)/gm
查看示例:https://regex101.com/r/cMyKVg/1/
当我将其放在我的php脚本中时,就像这样:
preg_match( '/(x)/m', $value, $matches )
$value
具有上面字符串的值。
我没有使用此代码的匹配项。 我也尝试过从字面上进行匹配:
preg_match( '/((\\x[\d]{2}){4,}.*)/m', 'b"\x01\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00X\x1D›¿\x04\x04›?‹„\x12¿Ã’\x11?"', $matches ),
但是它什么都不匹配。
我不想在数据库中使用此值,因此我想使用正则表达式跳过这样的值。
有人可以向我解释这种行为,也许可以解决这个问题?
编辑:
我觉得我使用的字符串实际上不是preg_match
中要使用的字符串,它是我通过var_dump
获得的值,但似乎preg_match
获得了不同的值。我不小心输入了错误,然后得到了以下消息:
ErrorException : preg_match(): Compilation failed: missing ) at offset 3
at /Users/used/Sites/project/app/Console/Commands/ExtractLibraryFileMetaData.php:204
200| dd(
201| $value,
202| \gettype($value),
203| $regex = '/(\\)/',
> 204| preg_match( $regex, $value, $matches ),
205| $matches
206| );
207| }
208| if ( preg_match( '/((\\x[\d]{2}){4,}.*)/m', $value ) ) {
Exception trace:
1 preg_match("/(\)/", "\\\\\\\\\\X���?���Ò?")
我不知道是什么原因造成的。仍然是相同的值,但是显示方式不同...
答案 0 :(得分:0)
十六进制字符不被视为字符串,字符串的实际输出可能是:
b"X›¿›?‹„¿Ã’?"
然后您可以使用十六进制范围进行匹配:
// I double-quoted the string
$str = "b\"\x01\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00X\x1D›¿\x04\x04›?‹„\x12¿Ã’\x11?\"";
// Matches characters from char code 0 to 31
preg_match_all('/([\x00-\x1F])/', $str, $m);
输出:
echo '<pre>' . print_r($m[0], true) . '</pre>';
/*
Array
(
[0] =>
[1] =>
[2] =>
[3] =>
[4] =>
[5] =>
[6] =>
[7] =>
[8] =>
[9] =>
[10] =>
[11] =>
[12] =>
[13] =>
[14] =>
[15] =>
[16] =>
)
*/
替换:
echo preg_replace('/([\x00-\x1F])/', '', $str);
// b"X›¿›?‹„¿Ã’?"
答案 1 :(得分:0)
出于任何原因,PHP中的preg_match似乎需要三个反斜杠才能正确地转义\ x。我使用此正则表达式preg_match('/((?:\\\x[\d]{2}){4,}.*)/m', $str, $matches)
进行了测试,并且可以正常工作。
您可以在此处找到现场演示:http://sandbox.onlinephpfunctions.com/code/4aecc4bf25ec82a98c8fbaee32b34693f3316f64
答案 2 :(得分:0)
在“工具”下方左下角查看regex101 code generator。您会看到正则表达式和输入字符串都进行了一些更改,这些更改与反斜杠相关。
您可以采用这种方法,也可以使用nowdoc,如下所示:
preg_match(<<< 'RE'
/(?:\\x\d{2}){4,}.*/
RE
,$str, $matches);
请参见PHP live demo here