2

假设我有以下字符串:

$str = 'Bag Attributes
    localKeyID: 28 B5 8E 16 11 88 E9 00 58 D5 76 30 12 B9 59 B8 E4 CE 7C AA
subject=/C=UK/ST=Suffolk/L=Ipswich/O=Example plc/CN=alice
issuer=/C=UK/ST=Suffolk/L=Ipswich/O=Example plc/CN=Certificate Authority/emailAddress=ca@example.com
-----BEGIN CERTIFICATE-----
MIIDDzCCAfegAwIBAgIJAMkyzQVK88NHMA0GCSqGSIb3DQEBBQUAMIGCMQswCQYD
VQQGEwJTRTESMBAGA1UECBMJU3RvY2tob2xtMQ4wDAYDVQQHEwVLaXN0YTEQMA4G
[...]
0fbkqbKulrchGbNgkankZtEVg4PGjo+Y8MdMjtfSZB29hwYvfMX09jzJ68ZqmpYQ
njvcVtLbEZN5OGCkaslb/f2OxLbsUNgIbws538WnaaufDvKmQe2kUdWmpl9Wn9Bf
bZq7B+njvcVa7SsWF/WLq5AUbw==
-----END CERTIFICATE-----';

我想删除上面的所有内容(可能包括),-----BEGIN CERTIFICATE-----但是我一生都无法弄清楚如何做到这一点。请注意,它并不总是如此-----BEGIN CERTIFICATE-----。它可能是--BEGIN CERTIFICATE--(两边都有两个-),也可能是-----BEGIN RSA PRIVATE KEY-----类似的东西。

无论如何,这是我尝试过的:

  1. echo preg_replace('#.*?-+[^\r\n]-+#s', '', $str);

    -+[^\r\n]-+与上述匹配-----BEGIN CERTIFICATE-----,我试图将每个字符与 .*? 但它不起作用。它停在-----END CERTIFICATE-----not at the -----BEGIN CERTIFICATE-----

  2. echo preg_replace('#.*?-+[^\r\n]-+#s', '', $str);

    和以前一样。即使?,在这种情况下,应该改变贪婪,它实际上似乎并没有真正做任何事情。

    IE。我正在尝试将每个字符匹配到

  3. echo preg_replace('#[.\r\n]*?-+.+-+#', '', $str);

    在这里,我试图匹配每个字符,包括-+.+-+. 我可以这样做.[^\r\n]因为我没有使用 s 修饰符,但它在这里也不起作用。相反,它只是匹配-+.+-+部分,就好像[.\r\n]*?没有退出一样。

有任何想法吗?

4

2 回答 2

2

使用preg_match()

$str = 'Bag Attributes
    localKeyID: 28 B5 8E 16 11 88 E9 00 58 D5 76 30 12 B9 59 B8 E4 CE 7C AA
subject=/C=UK/ST=Suffolk/L=Ipswich/O=Example plc/CN=alice
issuer=/C=UK/ST=Suffolk/L=Ipswich/O=Example plc/CN=Certificate Authority/emailAddress=ca@example.com
-----BEGIN CERTIFICATE-----
MIIDDzCCAfegAwIBAgIJAMkyzQVK88NHMA0GCSqGSIb3DQEBBQUAMIGCMQswCQYD
VQQGEwJTRTESMBAGA1UECBMJU3RvY2tob2xtMQ4wDAYDVQQHEwVLaXN0YTEQMA4G
[...]
0fbkqbKulrchGbNgkankZtEVg4PGjo+Y8MdMjtfSZB29hwYvfMX09jzJ68ZqmpYQ
njvcVtLbEZN5OGCkaslb/f2OxLbsUNgIbws538WnaaufDvKmQe2kUdWmpl9Wn9Bf
bZq7B+njvcVa7SsWF/WLq5AUbw==
-----END CERTIFICATE-----';

preg_match('/(?P<begin>-+[^-]+-+)(?P<body>.*?)(?P<end>-+[^-]+-+)/s', $str, $m);

echo 'begin: '. $m['begin'] .'<br>body: '.$m['body'].'<br> end: '. $m['end'];

一些解释:

(?P<begin> => 开始命名组

-+ => 匹配“-”之一或更多

[^-]+ => 匹配每个字符直到找到“-”

-+ => 匹配“-”之一或更多

) => 结束组

/s => 设置了 s 修饰符,因此模式中的点元字符匹配所有字符,包括换行符


这是一个 preg_replace() 解决方案:

$str = preg_replace('/.*?(-+[^-]+-+.*?-+[^-]+-+)/s', '$1', $str);

于 2013-04-02T18:28:50.720 回答
0
$pre = ';.*-+BEGIN CERTIFICATE-+';
$post = '-+END CERTIFICATE-+';
$out = preg_replace('/' . $pre . '(.*)' . $post . '/is', "$1", $str);

您可能希望保留原始字符串...

于 2013-04-02T18:27:22.277 回答