试图删除某一行以上的所有内容

时间:2013-04-02 18:19:40

标签: php regex preg-replace

说我有以下字符串:

$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-----而不是-----BEGIN CERTIFICATE-----

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

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

    即。我想把每个角色都匹配到

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

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

  4. 有什么想法吗?

2 个答案:

答案 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);

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