синтаксический анализ — использование PHP для интерпретации BBCode, но невозможно использовать str_replace

В настоящее время я использую класс 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));
}
}
?>

Любая помощь с благодарностью.

1

Решение

пустое пространство может быть в кодировке utf-8. Проверьте существующую строку, используя echo bin2hex($url) выяснить, какие байты он содержит.
Вы также можете попробовать это:

str_replace("\xE2\x80\xAF", "_", $url)

Это заменяет НУЛЬ-ШИРОКОЕ ПРОСТРАНСТВО (Кодировка UTF-8 E2 80 AFс подчеркиванием

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector