我有一个Vbulletin插件,它用hrefs替换了所有标签,但它需要自定义,因为它不支持非英文字符。
例如:#vbulletin将变为#vbullettin,但#može将变为#može,只有#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不是很好,所以也许我错了。我试着用我在这里或其他网站上找到的例子来改变一些部分,但没有成功。
我真的很感激任何帮助,这样我就可以用塞尔维亚拉丁字符标记单词,比如šdjžčćŠderžČć,如果可能的话,还可以标记整个塞尔维亚西里尔字符。
我论坛上的编码是UTF-8,数据库排序是utf8_general_ci,塞尔维亚字母在帖子中正确显示。我不知道这有关系,但以防万一。
提前谢谢。
谨致问候。
问题可能来自这一行,该行定义了两种处理用户标签的模式:
$possible = array('/'[hash]' . preg_quote($hash, '/') . ''['/hash']/iU', '/#' . preg_quote($hash) . '/iU');
你可以删除愚蠢的修饰符U(大多数时候完全无用),它使贪婪的量词变得不贪婪,反之亦然,并添加U修饰符,使其能够处理unicode字符。所以它可以这样重写:
$possible = array('~'[hash]' . preg_quote($hash, '~') . ''[/hash]~iu', '/#' . preg_quote($hash) . '/iu');
模式:#'[('w+?)(?>[^']]*?)'](.*)('[/'1'])#siU
也可以这样重写:
#'[('w+)[^]]*](.*?)('[/'1])#siu
不确定这是否能解决所有问题,但这至少是一个开始。