Php 正则表达式帮助:匹配所有匹配项并格式化字符串

Php 正则表达式帮助:匹配所有匹配项并格式化字符串,php,regex,Php,Regex,我只想将其作为第一组进行匹配-> e6 c4 aa 7a 7d 11 3d c2 6c cb 6e 3f b5 bc 61 27 e8 67 2c f7 我尝试了folwonig reg ex:\s+Cert散列。*\s[a-z0-9]{2}+ 但它只匹配作为第一组的f7 我正在应用reg ex的字符串是: [staf] NotBefore: 1/11/2016 9:48 AM [staf] NotAfter: 1/11/2024 9:48 AM [staf] S

我只想将其作为第一组进行匹配-> e6 c4 aa 7a 7d 11 3d c2 6c cb 6e 3f b5 bc 61 27 e8 67 2c f7

我尝试了folwonig reg ex:\s+Cert散列。*\s[a-z0-9]{2}+ 但它只匹配作为第一组的f7

我正在应用reg ex的字符串是:

    [staf]  NotBefore: 1/11/2016 9:48 AM
     [staf]  NotAfter: 1/11/2024 9:48 AM
     [staf] Subject: CN=My Root CA, O=Experian, OU=Hunter, L=Sofia, S=CA, C=BG
     [staf] Signature matches Public Key
     [staf] Root Certificate: Subject matches Issuer
     [staf] Template:
     [staf] Cert Hash(sha1): e6 c4 aa 7a 7d 11 3d c2 6c cb 6e 3f b5 bc 61 27 e8
67 2c f7
     [staf]   Key Container = 9c4336e8-9450-46b8-9bdc-cf70faafb29a
     [staf]   Unique container name: 2d800c871d70eba035d4612cdd5d1a61_48982b62-3

另外,如果我能去掉空格,只得到结果,那也太好了:e6c4aa7a7d113dc26ccb6e3fb5bc6127e8672cf7

这是因为Kleene星操作符的贪婪性:

\s+Cert Hash.*(\s[a-z0-9]{2})+
             ^greedy
只需将其设置为非贪婪,即可捕获所有项目:

\s+Cert Hash.*?(\s[a-z0-9]{2})+
此外,为了捕获它,您需要在要捕获的零件周围放置括号:

\s+Cert Hash.*?((\s[a-z0-9]{2})+)
所以包括+量词


现在似乎捕捉到了正确的组。

我倾向于避免使用懒惰/贪婪的点匹配,因为它通常会导致不必要的行为。在您的情况下,.*匹配证书哈希后的所有行的其余部分。我建议将其转换为一个否定字符类[^::::]*^1^,匹配零个或多个除:以外的字符,然后用捕获组^2^将\s[a-z0-9]{2}+子模式括起来,建议将非捕获组与\s[a-z0-9]{2}+一起使用,因为这里只需要一个分组,而不需要子匹配

因此,请使用:


语言是什么?不能用一个匹配操作匹配不连续的文本。将所有值与字符串方法匹配,然后使用字符串方法从组1值中删除空格。由于这是处理十六进制值[a-f0-9]可能更好。。。好答案:
\s+Cert Hash[^:]*:\s*((?:\s*[a-z0-9]{2})+)
            ^^1^^    ^--------2----------^
$re = '~\s+Cert Hash[^:]*:\s*((?:\s*[a-z0-9]{2})+)~'; 
$str = " [staf]  NotBefore: 1/11/2016 9:48 AM\n     [staf]  NotAfter: 1/11/2024 9:48 AM\n     [staf] Subject: CN=My Root CA, O=Experian, OU=Hunter, L=Sofia, S=CA, C=BG\n     [staf] Signature matches Public Key\n     [staf] Root Certificate: Subject matches Issuer\n     [staf] Template:\n     [staf] Cert Hash(sha1): e6 c4 aa 7a 7d 11 3d c2 6c cb 6e 3f b5 bc 61 27 e8\n67 2c f7\n     [staf]   Key Container = 9c4336e8-9450-46b8-9bdc-cf70faafb29a\n     [staf]   Unique container name: 2d800c871d70eba035d4612cdd5d1a61_48982b62-3"; 
preg_match($re, $str, $match);
echo preg_replace('~\s*~', '', $match[1]);
// => e6c4aa7a7d113dc26ccb6e3fb5bc6127e8672cf7