У меня есть плагин Vbulletin, который заменяет все хэштеги на hrefs, но его необходимо настроить, потому что он не поддерживает не английские символы.
Например: #vbulletin станет #vbulletin, но # може станет #mo только с #mo, преобразованным как хеш-тег.
Так как я не слишком разбираюсь в PHP, я скопирую содержимое файла, чтобы лучше понять.
<?php
$hashes = array();
do
{
if (!$matches = USERTAG::match(preg_replace('#\[(\w+?)(?>[^\]]*?)\](.*)(\[/\1\])#siU', '', $message), 'hash'))
{
break;
}
foreach ($matches as $hash)
{
$hash = trim($hash);
if (!$hash)
{
continue;
}
$hashes[] = htmlspecialchars_uni($hash);
}
if (!empty($hashes))
{
$hashes = array_unique($hashes);
if ($info['postid'])
{
$hashlist = USERTAG::$db->fetchAll('
SELECT *
FROM $usertag_hash AS hash
WHERE hash :queryList
AND postid = ?
AND type = ?
', array(
':queryList' => USERTAG::$db->queryList($hashes),
$info['postid'],
$info['type']
));
foreach ($hashlist as $results_r)
{
$key = array_search($results_r['hash'], $hashes);
if ($key === false)
{
continue;
}
unset($hashes[$key]);
}
}
foreach ($hashes as $key => $hash)
{
$hash = unhtmlspecialchars($hash);
if (!$hash)
{
unset($hashes[$key]);
continue;
}
$possible = array('/\[hash]' . preg_quote($hash, '/') . '\[\/hash\]/iU', '/#' . preg_quote($hash) . '/iU');
$message = preg_replace($possible, '[URL=' . $this->registry->options['bburl'] . '/usertag.php?do=list&action=hash&hash=' . urlencode($hash) . ']#' . $hash . '[/URL] ', $message, -1, $found);
}
$info['hash'] = $hashes;
}
}
while (false);
?>
На мой взгляд, это строка, которую нужно изменить:
if (!$matches = USERTAG::match(preg_replace('#\[(\w+?)(?>[^\]]*?)\](.*)(\[/\1\])#siU', '', $message), 'hash'))
Как я уже сказал, я не очень хорошо разбираюсь в PHP, так что, возможно, я ошибаюсь. Я пытался изменить некоторые части, используя примеры, которые я нашел здесь или на других сайтах, но безуспешно.
Я был бы очень признателен за любую помощь, поэтому я могу помечать слова сербскими латинскими символами, такими как šđžčćŠĐŽČĆ, и, если возможно, целыми символами сербской кириллицы.
Кодировка на моем форуме — UTF-8, сортировка базы данных — utf8_general_ci, сербские буквы правильно отображаются в сообщениях. Я не знаю, имеет ли это значение, но на всякий случай.
Заранее спасибо.
С уважением.
Проблема может исходить из этой строки, которая определяет два шаблона для работы с пользовательскими тегами:
$possible = array('/\[hash]' . preg_quote($hash, '/') . '\[\/hash\]/iU', '/#' . preg_quote($hash) . '/iU');
Вы можете удалить глупый модификатор U (абсолютно бесполезный большую часть времени) это делает жадные квантификаторы нежадными и наоборот, и добавляет модификатор u, который дает возможность работать с символами юникода. Так,
это можно переписать так:
$possible = array('~\[hash]' . preg_quote($hash, '~') . '\[/hash]~iu', '/#' . preg_quote($hash) . '/iu');
Шаблон: #\[(\w+?)(?>[^\]]*?)\](.*)(\[/\1\])#siU
тоже можно переписать так:
#\[(\w+)[^]]*](.*?)(\[/\1])#siu
Не уверен, что это решит все проблемы, но это как минимум начало.
Других решений пока нет …