Italo,
eu conheço pouco de php também, mas o que eu sei é que a função preg_replace() permite substituir sequências baseadas em expressões regulares.
$tag.$token isso é concatenação.
hash('sha512',$tag.$token) vai usar um hash em SHA512 nas 2 variáveis concatenadas.
'/[^\x20-\x7E]+/' é uma expressão regular que significa "qualquer coisa que não seja um código de caractere no intervalo hexadecimal 0x20 a 0x7E, ou seja, 32 a 126 em ascii(https://www.ime.usp.br/~pf/algoritmos/apend/ascii.html) "
^ not
\x20 hex código para o caracter de espaço
- to
\x7e hex código para o caracter ~
Então, qualquer coisa que não esteja neste intervalo será substituído por ''(vazio). Lembrando que esse replace só acontece para o conteúdo das tags, todas as tags são removidas.
Você pode fazer um teste colocando o código disponibilizado no site da prefeitura, neste link(http://phptester.net/) para testar o funcionamento do código.
Substituindo as variáveis($tag e $token) pelo conteudo informado para se chegar ao valor da tag de integridade como mostra a imagem.
A tag de integridade foi gerada exatamente igual ao exemplo da prefeitura de Limeira.
Pode-se testar os valores de cada variavel em cada momento do processamento colocando o echo depois de cada código, como na imagem abaixo.
Eu estou perto de conseguir implementar, se conseguir, envio o código para vocês.
Meu problema está no hash que não ta batendo, estou usando a DLL WinCrypt mas não ta batendo
SSL.SSLCryptLib := cryWinCrypt;
SSL.SSLHttpLib := httpWinHttp;
SSL.SSLXmlSignLib := xsLibXml2;
Memo2.Text := lowerCase(SSL.CalcHash(XML + WSChaveAcesso, dgstSHA512, outHexa, False));