我目前正在使用一个PHP类来解释通过表单输入的BBCode,以便在用户访问其页面时,它能正确显示在用户的页面上。
然而,我在从BBCode到HTML的转换中遇到了一个障碍,因为我希望它能转换以下
[wiki]Article Title Here[/wiki]
至
<a href="http://example.com/article_title_here">Article Title Here</a>
但它目前只转换为
<a href="http://example.com/article title here">Article Title Here</a>
我曾尝试使用str_replace用下划线重新排列空格,但目前似乎不太适用。
我发布了下面的代码作为参考,如果它有帮助的话,我目前正在运行PHP 7.0.4。
<?php
class bbcode {
public static function tohtml($text,$advanced=FALSE,$charset='utf-8'){
$basic_bbcode = array(
'[b]', '[/b]',
'[i]', '[/i]',
'[u]', '[/u]',
);
$basic_html = array(
'<b>', '</b>',
'<i>', '</i>',
'<u>', '</u>',
'<s>', '</s>',
);
$text = str_replace($basic_bbcode, $basic_html, $text);
if ($advanced){
$advanced_bbcode = array(
'#'[wiki](.+)'[/wiki]#Usi',
'#'[email](['w'.'-]+@[a-zA-Z0-9'-]+'.?[a-zA-Z0-9'-]*'.'w{1,4})'[/email]#Usi',
'#'[email=(['w'.'-]+@[a-zA-Z0-9'-]+'.?[a-zA-Z0-9'-]*'.'w{1,4})](.+)'[/email]#Usi',
'#'[img](.+)'[/img]#Usi',
'#'[img=(.+)](.+)'[/img]#Usi',
'#'[code]('r'n)?(.+?)('r'n)?'[/code]#si',
'#'[youtube]http://[a-z]{0,3}.youtube.com/watch'?v=([0-9a-zA-Z]{1,11})'[/youtube]#Usi',
'#'[youtube]([0-9a-zA-Z]{1,11})'[/youtube]#Usi',
);
$advanced_html = array(
'<a target="_blank" href="http://example.com/$1">$1</a>',
'<a href="mailto: $1">$1</a>',
'<a href="mailto: $1">$2</a>',
'<img src="$1" alt="$1" />',
'<img src="$1" alt="$2" />',
'<div class="code">$2</div>',
'<object type="application/x-shockwave-flash" style="width: 450px; height: 366px;" data="http://www.youtube.com/v/$1"><param name="movie" value="http://www.youtube.com/v/$1" /><param name="wmode" value="transparent" /></object>',
'<object type="application/x-shockwave-flash" style="width: 450px; height: 366px;" data="http://www.youtube.com/v/$1"><param name="movie" value="http://www.youtube.com/v/$1" /><param name="wmode" value="transparent" /></object>',
);
$text = preg_replace($advanced_bbcode, $advanced_html,$text);
}
return bbcode::nl2br($text);
}
public static function remove($text){
$text = htmlspecialchars($text, ENT_QUOTES,$charset);
return $text;
}
public static function nl2br($var){
return str_replace(array('''r''n',''r''n','r''n',''r'n', ''n', ''r'), '<br />', nl2br($var));
}
}
?>
非常感谢您的帮助。
空白可能是utf-8编码的。使用echo bin2hex($url)
检查现有的字符串,找出它包含的字节数。你也可以试试这个:
str_replace("'xE2'x80'xAF", "_", $url)
这将用下划线替换ZERO-WIDTH SPACE(UTF-8编码E2 80 AF
)。