preg_replace 与 urlencode

preg_replace with urlencode

我正在尝试使用 preg_replace 创建话题标签链接,当话题标签中出现“”时我遇到了问题。我不太擅长模式,所以任何帮助将不胜感激:

我的模式:

$hashtags_url = '/(\#)([x00-\xFF]+[a-zA-Z0-9x00-\xFF_\w]+)/';

$body = preg_replace($hashtags_url, '<a href="'.$hashtag_path.'" title="#">#</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>