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--(両側に2つの - がある)またはその-----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);

    ここでは、 までのすべての文字を一致させようとしてい-+.+-+ます。s 修飾子を使用していないため、.代わりに実行できますが、ここでも機能しません。[^\r\n]代わりに、存在しない-+.+-+かのようにパーツを一致させるだけです。[.\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> => 名前付きグループの開始

-+ => 「-」以上の 1 つに一致

[^-]+ => 「-」が見つかるまですべての文字に一致

-+ => 「-」以上の 1 つに一致

) => 終了グループ

/s => s 修飾子が設定されているため、パターン内のドット メタ文字は、改行を含むすべての文字に一致します


preg_replace() ソリューションは次のとおりです。

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

于 2013-04-02T18:28:50.720 に答える