出于某种原因,我无法为我的生活,使用链接到#Hashtag的锚标记正确地使用strtolower ...甚至使用preg_replace_callback()。
public static function convertHashtags($str) {
$str = preg_replace_callback(
'/(\#([a-z0-9_]+))/ix',
function( $matches ) {
$uri = strtolower($matches[2]);
// return $uri;
return '<a href="'. SITE_URL .'/hashtag/'. $uri .'">'. $matches[1] .'</a>';
}, $str, -1);
return $str;
}
所有这一切需要抓住#hashtag并将其转换为链接。当#HashTag保留原始格式时,网址需要小写。
示例:
#Palladia turns into:
<a href="/hashtag/palladia">#Palladia</a>
然而,我注意到一些不可思议的东西......如果我在回报中加上一个#,就在$ match [1]之前它运行正常,但显然会显示2#。所以我想,好吧,我只是在前面使用$ match [2]和#。不,不行。无论出于何种原因,它需要#Palladia前面的额外#...这导致不太理想的结果:
<a href="/hashtag/palladia">##Palladia</a>
奇怪的是,如果我只是返回strotolower($ matches [2]),它会将字符串小写...它只是不想在锚标记内部工作。 有没有人知道如何制作它所以我不需要额外的#那里?
答案 0 :(得分:2)
我认为混淆来自$matches
中的内容 - 你有两组括号,但实际上只需要一个在主题标签后捕获文本。
我稍微简化了代码:
public static function convertHashtags($str) {
return preg_replace_callback(
'/#([\w]+)/', // all "word" characters, all digits, and underscore
// brackets around the string AFTER the hashtag
function( $matches ) {
// $matches[0] is the complete match (including the hashtag)
// $matches[1] is the match for the subpattern enclosed in brackets
return '<a href="'. SITE_URL .'/hashtag/'
. strtolower($matches[1]) .'">'
. $matches[0] .'</a>';
}, $str);
}
convertHashtags('#Palladium')
// output: <a href="SITE_URL/hashtag/palladium">#Palladium</a>
还适用于包含多个主题标签的文本:
convertHashtags("I love #StackOverflow and #Hashtags. They're awesome! #Awesomesauce");
// output: I love <a href="SITE_URL/hashtag/stackoverflow">#StackOverflow</a> and
// <a href="SITE_URL/hashtag/hashtags">#Hashtags</a>. They're awesome! <a
// href="SITE_URL/hashtag/awesomesauce">#Awesomesauce</a>