我们说我有这个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字符串/变量。我需要将任何&符号转换为和号(&amp;)的html,但仅用于href参数值。不是href =之前的&符号,也不是电子邮件中的其他地方。
例如,注释可能包含:
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);
答案 0 :(得分:0)
解决方案是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>";