preg_replace 与 urlencode

问题描述

我正在尝试使用 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>

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...