我正在使用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}
而非实际链接。
答案 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);
它需要一个函数作为第二个参数。此函数从正则表达式传递一系列匹配项,并且应该返回整个替换字符串。
答案 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);
}