如何仅在美元符号 1 ($1) 中替换正则表达式预替换中的字符?
How do i replace characters in a regex preg replace in the dollar sign 1 ($1) only?
假设我有这个 preg 替换:
$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href="></a>', $emailnote);
它将文本 url 替换为可点击的链接,但采用我需要的格式,因为我需要以某种方式处理点击,然后再将它们重定向到最终目的地。不管怎样,你看到两个美元符号 1's ($1) 了吗?我想替换第一个字符而不是第二个字符,而且我只想替换 href= 之后的文本字符,而不是整个 $emailnote string/variable。我需要将任何符号转换为 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="></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().'"></a>', $emailnote);
//$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.ampReplace('').'"></a>', $emailnote);
$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.ampReplace("").'"></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').'"></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').'"></a>', $emailnote);
//$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.urlencode('').'"></a>', $emailnote);
//$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.urlencode("").'"></a>', $emailnote);
//$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.urlencode('\').'"></a>', $emailnote);
$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.urlencode("\").'"></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);
如果将 & 符号转换为以下 return 行可能会更好:%26amp%3B --- 它应该只是 %26
return "<a href=\"".SITE_DOMAIN."index/goto.php?file_id=".$_POST['id']."&href=".urlencode(str_replace('&','&',$matches[1]))."\">".$matches[1]."</a>";
假设我有这个 preg 替换:
$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href="></a>', $emailnote);
它将文本 url 替换为可点击的链接,但采用我需要的格式,因为我需要以某种方式处理点击,然后再将它们重定向到最终目的地。不管怎样,你看到两个美元符号 1's ($1) 了吗?我想替换第一个字符而不是第二个字符,而且我只想替换 href= 之后的文本字符,而不是整个 $emailnote string/variable。我需要将任何符号转换为 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="></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().'"></a>', $emailnote);
//$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.ampReplace('').'"></a>', $emailnote);
$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.ampReplace("").'"></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').'"></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').'"></a>', $emailnote);
//$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.urlencode('').'"></a>', $emailnote);
//$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.urlencode("").'"></a>', $emailnote);
//$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.urlencode('\').'"></a>', $emailnote);
$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.urlencode("\").'"></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);
如果将 & 符号转换为以下 return 行可能会更好:%26amp%3B --- 它应该只是 %26
return "<a href=\"".SITE_DOMAIN."index/goto.php?file_id=".$_POST['id']."&href=".urlencode(str_replace('&','&',$matches[1]))."\">".$matches[1]."</a>";