说我有以下字符串:
$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-----
或类似的东西。
无论如何,这是我尝试过的:
echo preg_replace('#.*?-+[^\r\n]-+#s', '', $str);
-+[^\r\n]-+
匹配-----BEGIN CERTIFICATE-----
所以上面我尝试将每个字符与。*匹配。但它不起作用。它停在-----END CERTIFICATE-----
而不是-----BEGIN CERTIFICATE-----
。
echo preg_replace('#.*?-+[^\r\n]-+#s', '', $str);
和以前一样。即使在这种情况下,?应该改变贪婪,实际上它似乎并没有做任何事情。
即。我想把每个角色都匹配到
echo preg_replace('#[.\r\n]*?-+.+-+#', '', $str);
在这里,我试图匹配每个角色,包括-+.+-+
。我可以.
而不是[^\r\n]
,因为我没有使用s修饰符,但它也没有在这里工作。相反,它只是匹配-+.+-+
部分,就像[.\r\n]*?
没有退出一样。
有什么想法吗?
答案 0 :(得分: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>
=&gt;启动命名组
- + =&gt;匹配“ - ”或更多
之一[^ - ] + =&gt;匹配每个字符,直到找到“ - ”
- + =&gt;匹配“ - ”或更多
之一) =&gt;结束小组
/ s =&gt;设置了s修饰符,因此模式中的点元字符匹配所有字符,包括换行符
这是一个preg_replace()解决方案:
$str = preg_replace('/.*?(-+[^-]+-+.*?-+[^-]+-+)/s', '$1', $str);
答案 1 :(得分:0)
$pre = ';.*-+BEGIN CERTIFICATE-+';
$post = '-+END CERTIFICATE-+';
$out = preg_replace('/' . $pre . '(.*)' . $post . '/is', "$1", $str);
您可能希望保留原始字符串...