php 如何在进行 base64encode 的同时进行 preg_replace

php how to do base64encode while doing preg_replace

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

我正在使用 preg_replace 这样的:

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

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

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

如何 base64encode href 值,即 </code>?</p> <p>我试过:</p> <pre><code>$html = array('<a href="/url/'.base64_encode('{}').'/"></a>');

但它的编码是 {} 而不是实际的 link。

我猜你不能用 preg_replace 来做到这一点,相反,你必须使用 preg_match_all 并在结果中循环:

$bbcode = array('#\[url=(.+)](.+)\[/url\]#Usi');
$html = array('<a href=""></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('',''), 
          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);
}

您可以使用 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);

它接受一个函数作为第二个参数。该函数从您的正则表达式中传递一组匹配项,预计 return 返回整个替换字符串。