问题描述
我正在尝试使用 preg_replace 创建主题标签链接,但在主题标签中存在“”时遇到问题。我不太擅长模式,所以任何帮助将不胜感激:
我的模式:
$hashtags_url = '/(\#)([x00-\xFF]+[a-zA-Z0-9x00-\xFF_\w]+)/';
$body = preg_replace($hashtags_url,'<a href="'.$hashtag_path.'$2" title="#$2">#$2</a>',$body);
这对于普通的主题标签非常有效,但问题是当我尝试对 $2 参数进行 urlencode 时。
我试过了
$hashtags_url = '/(\#)([x00-\xFF]+[a-zA-Z0-9x00-\xFF_\w]+[x00-\xFF]+[a-zA-Z0-9x00-\xFF_\w])/';
和
$body = preg_replace_callback(
$hashtags_url,function($matches) {
return "<a href=\"$hashtag_path/hashtag/".urlencode($matches[2])."\">#".
$matches[2]."</a>";
},$body);
一切顺利,但现在省略了单字主题标签。
解决方法
您可以使用以下简化的正则表达式,通过 $matches[1]
访问用作替换参数的匿名函数中的主题标签名称:
/#(\S+)/
确保使用 use
关键字将所有必需的变量传递给回调函数(请参阅 use ($hashtag_path)
)。
见PHP demo:
$body = "Text text #hashtag text text #hast/tag";
$hashtag_path = '/path/to';
$hashtags_url = '/#(\S+)/';
$body = preg_replace_callback(
$hashtags_url,function($matches) use ($hashtag_path) {
return "<a href=\"$hashtag_path/hashtag/".urlencode($matches[1])."\">".$matches[0]."</a>";
},$body);
echo $body;
输出:
Text text <a href="/path/to/hashtag/hashtag">#hashtag</a> text text <a href="/path/to/hashtag/hast%2Ftag">#hast/tag</a>