字符串\ x00 \ x01

时间:2018-08-16 09:47:19

标签: php regex preg-match

我有一个循环,有时包含以下数据: 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���?���Ò?")

我不知道是什么原因造成的。仍然是相同的值,但是显示方式不同...

3 个答案:

答案 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