php preg_match s 和 m 修饰符不适用于多行

php preg_match s and m modifiers not working for multiple lines

我有以下由多行组成的输入字符串:

BYTE    ,,,,,,,,,,,,,,,,,,,,,,,[=12=]C,,,,,,,,,,,,,,,, // comment
BYTE    ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

我使用下面的 preg_match 语句来匹配数据部分(因此只有十六进制值)而不是前面的白色 space 和文本,也不匹配尾随的白色 space 和评论区:

preg_match('/($.*?) /s', $sFileContents, $aResult);

输出是这样的:

output: Array
(
    [0] => ,,,,,,,,,,,,,,,,,,,,,,,[=14=]C,,,,,,,,,,,,,,,, 
    [1] => ,,,,,,,,,,,,,,,,,,,,,,,[=14=]C,,,,,,,,,,,,,,,,
)

如您所见,匹配似乎是正确的,但第一行输入重复了两次。 's' 修饰符应该可以帮助我越过行尾,但我似乎无法越过第一行。

有人知道如何进行吗?

为此您不需要 s (DOTALL) 标记。您可以使用:

preg_match_all('/($[0-9A-Fa-f]{2}(?:,$[0-9A-Fa-f]{2})+)/', $input, $m);
print_r($m[1]);

RegEx Demo

您可以轻松匹配所有行的数据:

preg_match_all('/$[\dA-Fa-f,$]+/', $sFileContents, $aResult);
echo "<pre>".print_r($aResult,true);

输出:

$aResultArray:
(
    [0] => Array
        (
            [0] => ,,,,,,,,,,,,,,,,,,,,,,,[=11=]C,,,,,,,,,,,,,,,,
            [1] => ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
        )

)