Php 试图删除某条线以上的所有内容
假设我有以下字符串:Php 试图删除某条线以上的所有内容,php,regex,preg-replace,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/emailAddr
$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证书------
上面的所有内容(可能包括这些内容),但我一辈子都不知道该怎么做。请注意,它并不总是----begincertificate-----
。它可以是--BEGIN证书--
(两边各有两个-),也可以是--BEGIN RSA私钥--
之类的东西
不管怎样,以下是我尝试过的:
echo preg\u replace(“#.*?-+[^\r\n]+#s',”$str)代码>
-+[^\r\n]-+
匹配----BEGIN CERTIFICATE-----
因此,通过上面的内容,我尝试将每个字符都匹配到。*?但它不起作用。它在----结束证书------
处停止,而不是在----开始证书------
处停止
echo preg\u replace(“#.*?-+[^\r\n]+#s',”$str)代码>
和以前一样。即使?在这种情况下,被认为是在改变贪婪,但实际上它似乎并没有做任何事情
我试着把每个角色都匹配到
echo preg_替换(“#[.\r\n]*?-+。+-+++,”,“$str)代码>
在这里,我试图匹配每个字符,包括-+。+-+
。我可以使用
而不是[^\r\n]
,因为我没有使用s修饰符,但它在这里也不起作用。相反,它只是匹配-+.+-+
部分,就好像[。\r\n]*?
没有退出一样
$pre = ';.*-+BEGIN CERTIFICATE-+';
$post = '-+END CERTIFICATE-+';
$out = preg_replace('/' . $pre . '(.*)' . $post . '/is', "$1", $str);
您可能希望保留原始字符串…使用:
$str='行李属性
localKeyID:28 B5 8E 16 11 88 E9 00 58 D5 76 30 12 B9 59 B8 E4 CE 7C AA
主题=/C=UK/ST=Suffolk/L=Ipswich/O=Example plc/CN=alice
发卡机构=/C=UK/ST=Suffolk/L=Ipswich/O=示例plc/CN=证书颁发机构/电子邮件地址=ca@example.com
-----开始证书-----
MIIDDzCCAfegAwIBAgIJAMkyzQVK88NHMA0GCSqGSIb3DQEBBQUAMIGCMQswCQYD
VQGEWJTRTEMBAGA1ECBMJU3RVY2TOB2XTMQ4WDAYDVQHEWVLAXN0YTEQMA4G
[...]
0FBKQBKULRCHBNGKANKZTEVG4PGJO+Y8MdMjtfSZB29hwYvfMX09jzJ68ZqmpYQ
njvcVtLbEZN5OGCkaslb/F2OxlbsungibWS538WNAAUFDKMQE2KUDWMPL9WN9BF
bZq7B+njvcVa7SsWF/WLq5AUbw==
-----结束证书------';
preg_match('/(?P-+[^-]+-+)(?P.?(?P-+[^-]+-+)/s',$str,$m);
回显“开始:”$m['begin'..'
正文:'.$m['body'.].
结尾:'$m['end'];
一些解释:
(?p
=>启动命名组
-+=>匹配一个或多个“-”字符
[^-]+=>匹配每个字符,直到找到“-”
-+=>匹配一个或多个“-”字符
)=>关闭组
/s=>设置了s修饰符,因此模式中的点元字符匹配所有字符,包括换行符
这里有一个preg_replace()解决方案:
$str=preg_replace('/.-(+[^-]+-+.-+.-+[^-]+-+)/s','$1',$str)代码>那么?您为什么不直接使用explode()
?为什么不使用strstr($text,----begincertificate-----')
?在一个简单的字符串操作中使用正则表达式就像用核弹炸一座建筑物,在一个壁橱里打一只苍蝇。@HamZa DzCyberDeV-因为我不想把字符串转换成数组?因为我更喜欢简洁的代码,而不是做for循环等等?因为我想进一步了解regex?@Marc B-如果它不是--BEGIN CERTIFICATE-----
,而是--BEGIN RSA私钥------
,该怎么办?或者,如果是--开始证书--
,两边只有两个破折号,而不是五个破折号,该怎么办?这就是我使用正则表达式的原因。@dnagirl:这不是电子邮件标题,与电子邮件无关。嗯,可以了。我一直坚持使用preg_replace,所以我没有考虑使用preg_match lol。我仍然很好奇为什么preg_replace不起作用。你必须使用s修饰符才能使它与新行一起工作。请记住,我希望它不仅仅匹配----begincertificate-----
。见鬼-用----END CERTIFICATE-----
替换它,这样就有两个证书,然后正则表达式就会崩溃。它将不匹配第一个,而是最后一个,并取代一切。
$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'];