php在执行preg_replace时如何做base64encode

时间:2015-03-30 07:30:49

标签: php base64 preg-replace encode

我正在使用preg_replace查找BBCODE并将其替换为HTML代码, 但是在这样做时,我需要base64encode网址,我该怎么做?

我正在使用preg_replace这样:

<?php
$bbcode = array('#\[url=(.+)](.+)\[/url\]#Usi');

$html = array('<a href="$1">$2</a>');

$text = preg_replace($bbcode, $html,$text);

我如何base64encode href$1

我尝试过:

$html = array('<a href="/url/'.base64_encode('{$1}').'/">$2</a>');

但它编码{$1}而非实际链接。

2 个答案:

答案 0 :(得分:2)

您可以使用preg_replace_callback()功能代替preg_replace

<?php

$text = array('[url=www.example.com]test[/url]');
$regex = '#\[url=(.+)](.+)\[/url\]#Usi';

$result = preg_replace_callback($regex, function($matches) {
    return '<a href="/url/'.base64_encode($matches[1]).'">'.$matches[2].'</a>';
}, $text);

它需要一个函数作为第二个参数。此函数从正则表达式传递一系列匹配项,并且应该返回整个替换字符串。

TEST

答案 1 :(得分:-1)

我猜你不能用preg_replace来做,而是必须使用preg_match_all并在结果中循环:

$bbcode = array('#\[url=(.+)](.+)\[/url\]#Usi');
$html = array('<a href="$1">$2</a>');
$out = array();
$text = preg_matc_all($text, $bbcode, $out, PREG_SET_ORDER);

for ($i = 0; $i < count($out); $i++) {
   // $out[$i][0] should be the html matched fragment
   // $out[$i][1] should be your url
   // $out[$i][2] should be the anchor text

   // fills the $html replace var
   $replace = str_replace(
          array('$1','$2'), 
          array(base64_encode($out[$i][1]), $out[$i][2]), 
          $html);

   // replace the full string in your input text
   $text = str_replace($out[$i][0], $replace, $text);
}