我需要一个简单的正则表达式字符串。
例如,这就是我的正则表达式示例。
preg_replace('#([a-z]+)\:\:' . "([\r\n a-z0-9=]*)" . '#is', '\1:: \2', /* Example string */)
那就是示例字符串。
dn: CN=Gast,CN=Users,DC=question,DC=local
changetype: add
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: Gast
description::
Vm9yZGVmaW5pZXJ0ZXMgS29udG8gZsO8ciBHYXN0enVncmlmZiBhdWYgZGVuIENvbXB1dGVyIGJ6dy
4gZGllIERvbcOkbmU=
name: Gast
sAMAccountName: Gast
unicodePwd::IgA2AEcATQBNAHQANwBoADcAIgA=
userAccountControl:512
结果如下。
dn: CN=Gast,CN=Users,DC=question,DC=local
changetype: add
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: Gast
description:
Vm9yZGVmaW5pZXJ0ZXMgS29udG8gZsO8ciBHYXN0enVncmlmZiBhdWYgZGVuIENvbXB1dGVyIGJ6dy
4gZGllIERvbcOkbmU=
name: Gast
sAMAccountName: Gast
unicodePwd::IgA2AEcATQBNAHQANwBoADcAIgA=
userAccountControl:512
我会得到这个结果。
dn: CN=Gast,CN=Users,DC=question,DC=local
changetype: add
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: Gast
description:: Vm9yZGVmaW5pZXJ0ZXMgS29udG8gZsO8ciBHYXN0enVncmlmZiBhdWYgZGVuIENvbXB1dGVyIGJ6dy4gZGllIERvbcOkbmU=
name: Gast
sAMAccountName: Gast
unicodePwd::IgA2AEcATQBNAHQANwBoADcAIgA=
userAccountControl:512
然后我可以这样做。
$lines = explode("\r\n", /* Example string */);
foreach($lines as $line)
{
$tmp = explode(':', $line);
if(count($tmp) > 2)
{
$tmp = explode('::', $line);
$tmp[1] = base64_decode($tmp[1]);
}
}
或者是否可以更容易地做到这一点?
提前感谢您!
答案 0 :(得分:1)
这也是可能的:
1。)在::
和space-newlines-space
$str = preg_replace('/::\K\s+|\s*\n(?=[^:]*(\n|$))\s*/', "", $str);
正则表达式explanation at regex101。在::
|之后删除空白字符如果下一行中没有冒号,则使用空格 - 换行符 - 空格(使用lookahead进行检查)。
2。)base64 decode using a callback:
$str = preg_replace_callback('/(?<=::)\S+/',
function ($m) { return base64_decode($m[0]); },
$str);
使用lookbehind,see regex101 \S+
之后的 ::
非空格字符
3.)在::
$str = str_replace("::", ":: ", $str);
如果您的PHP版本不支持匿名函数,请将该函数交换出来:
function b64d ($m) { return base64_decode($m[0]); }
$str = preg_replace_callback('~(?<=::)\S+~', "b64d", $str);
希望这有帮助!