В настоящее время я использую класс 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)
Это заменяет НУЛЬ-ШИРОКОЕ ПРОСТРАНСТВО (Кодировка UTF-8 E2 80 AF
с подчеркиванием
Других решений пока нет …