在两个特殊字符串之间编码内容

时间:2016-10-02 21:19:03

标签: php preg-match preg-match-all

我想要的只是获取两个字符串之间的内容,如下一行:

$content = '81Lhello82R 81Lmy82R 81Lwife82R';

我希望在81L82R之间获取所有内容,然后通过Preg_match自动将它们编码为Base64我想,我已经做了一些方法来做但没有做到得到预期的结果!

基本表格:

81Lhello82R 81Lmy82R 81Lwife82R

输出:

81LaGVsbG8=82R 81LbXk=82R 81Ld2lmZQ==82R

2 个答案:

答案 0 :(得分:1)

硬规则:

$leftMask = '81L';
$rightMask = '82R';
$content = '81Lhello82R 81Lmy82R 81Lwife82R';
preg_match_all('#'.$leftMask.'(.*)'.$rightMask.'#U',$content, $out);
$output = [];
foreach($out[1] as $val){
   $output[] = $leftMask.base64_encode($val).$rightMask;
}
$result = str_replace($out[0], $output, $content);

RegExp规则

$leftMask = '\d{2}L';
$rightMask = '\d{2}R';
$content = '81Lhello82R 81Lmy82R 81Lwife82R';
preg_match_all('#('.$leftMask.')(.*)('.$rightMask.')#U',$content, $out);;
$output = [];
foreach($out[2] as $key=>$val){
   $output[] = $out[1][$key].base64_encode($val).$out[3][$key];
}
$result = str_replace($out[0], $output, $content);

答案 1 :(得分:0)

这是preg_replace_callback的工作:

$content = '81Lhello82R 81Lmy82R 81Lwife82R';
$output = preg_replace_callback(
            '/(?<=\b\d\dL)(.+?)(?=\d\dR)/',
            function($matches) {
                return base64_encode($matches[1]);  // encode the word and return it
            },
            $content);
echo $output,"\n";

其中

  • (?<=\b\d\dL)是一个肯定的lookbehind,可确保我们在要编码的字词之前有2位数字和字母L
  • (?=\d\dR)是一个肯定的lookahead,可以确保我们有2个数字,并且在要编码的字后面有字母R
  • (.+?)是包含要编码的单词
  • 的捕获组

<强>输出:

81LaGVsbG8=82R 81LbXk=82R 81Ld2lmZQ==82R