php,regex和ldifde base64_encode /替换多行

时间:2014-08-15 08:04:42

标签: php regex

我需要一个简单的正则表达式字符串。

例如,这就是我的正则表达式示例。

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]);
    }
}

或者是否可以更容易地做到这一点?

提前感谢您!

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);
使用lookbehindsee regex101

\S+之后的

::非空格字符

3.)在::

之后添加空格
$str = str_replace("::", ":: ", $str);

请参阅example at eval.in


如果您的PHP版本不支持匿名函数,请将该函数交换出来:

function b64d ($m) { return base64_decode($m[0]); }
$str = preg_replace_callback('~(?<=::)\S+~', "b64d", $str);

希望这有帮助!