php - 如何仅在美元符号 1 ($1) 中替换正则表达式 preg 中的字符?
问题描述
假设我有这个 preg 替换:
$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href=$1">$1</a>', $emailnote);
它将文本网址替换为可点击的链接,但采用我需要的格式,因为我需要在将它们重定向到最终目的地之前以某种方式处理该点击。无论如何,你看到两个美元符号 1 ($1) 了吗?我想替换第一个而不是第二个的字符,而且我只想替换 href= 之后的文本的字符,而不是整个 $emailnote 字符串/变量。我需要将任何 & 符号转换为 & 符号 (&) 的 html,但仅用于 href 参数值。不是 href= 之前的 & 符号,也不是 emailnote 中的其他地方。
例如,一个便条可能有这样的:
http://example.com/folder/?something&ok blah blah blah & blah
当表单与文本框中的文本一起提交时,我会去处理它。我让数据库按原样保存它,然后我也通过电子邮件发送它,我只需要将它转换为电子邮件。我需要这样的电子邮件来显示它:
<a href="http://example2.com/index/goto.php?file_id=123&href=http://example.com/folder/?something&ok">http://example.com/folder/?something&ok</a> blah blah blah & blah
我试过的东西不起作用......
事情1:
$emailnote = str_replace('&','&', preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href=$1">$1</a>', $emailnote));
事情2:
function ampReplace($str) {
$str = str_replace('&', '&', $str);
return $str;
}
//only 1 of these at a time, not all at once...
//$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.ampReplace($1).'">$1</a>', $emailnote);
//$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.ampReplace('$1').'">$1</a>', $emailnote);
$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.ampReplace("$1").'">$1</a>', $emailnote);
谢谢你的帮助。
编辑
不介意 url 编码整个 href 参数值,而不仅仅是转换一个 & 符号,但我该怎么做呢?
例如输出将是这样的,但就像我说的,我不知道如何实现:
<a href="http://example2.com/index/goto.php?file_id=123&href=http%3A%2F%2Fexample.com%2Ffolder%2F%3Fsomething%26ok">http://example.com/folder/?something&ok</a> blah blah blah & blah
编辑
我尝试的接下来的事情没有奏效。
//$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.urlencode('\\1').'">$1</a>', $emailnote);
//$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.urlencode('\$1').'">$1</a>', $emailnote);
//$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.urlencode('$1').'">$1</a>', $emailnote);
//$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.urlencode("$1").'">$1</a>', $emailnote);
//$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.urlencode('\\$1').'">$1</a>', $emailnote);
$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.urlencode("\\$1").'">$1</a>', $emailnote);
解决方案
解决方案是preg_replace_callback
,我见过几次提到,但不知道如何实现它,但我想通了。
$emailnote = preg_replace_callback("@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@",
function($matches) {
return "<a href=\"".SITE_DOMAIN."index/goto.php?file_id=".$id."&href=".urlencode($matches[1])."\">".$matches[1]."</a>";
},
$emailnote);
如果&符号转换为以下返回行可能会更好: %26amp%3B --- 它应该只是 %26
return "<a href=\"".SITE_DOMAIN."index/goto.php?file_id=".$_POST['id']."&href=".urlencode(str_replace('&','&',$matches[1]))."\">".$matches[1]."</a>";
推荐阅读
- bash - 带有 ls -ls 和 OR 模式通配符的 Shell 脚本
- java - 在 k8 pod 中运行 jcmd,权限被拒绝或无法打开套接字文件
- azure - 如何在第一个管道上的阶段完成时运行第二个 Azure 管道
- unix - 从终端的父文件夹运行程序
- async-await - 来自 S3 FastAPI 的响应文件流
- javascript - 将 Summernote 与 Webpack 一起使用
- amazon-web-services - 使用 NLB 和 IAM 身份验证公开 AWS MSK - 主机名验证失败
- json - 如何从 Json 文件创建对象列表
- javascript - 测试什么:JavaScript 或 TypeScript?
- django - 在 django 中订购 pip 包版本