【问题标题】:How do i replace characters in a regex preg replace in the dollar sign 1 ($1) only?如何仅在美元符号 1 ($1) 中替换正则表达式 preg 中的字符?
【发布时间】:2018-06-12 17:41:52
【问题描述】:

假设我有这个 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&amp;ok">http://example.com/folder/?something&ok</a> blah blah blah & blah

我试过的东西不起作用......

事情 1:

$emailnote = str_replace('&','&amp', 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('&', '&amp;', $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);

【问题讨论】:

  • 你有 7 个捕获组,你为什么不能选择你想要替换的?请注意,第 5-7 组将被覆盖到最后一次迭代。
  • 这是一个 URL 参数,整个东西都应该是 URL 编码的。
  • 我不介意整个 url 是否被 url 编码,只要它只是 href 参数值而不是别的。我该怎么做呢?

标签: php regex preg-replace str-replace


【解决方案1】:

解决方案是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('&amp;','&',$matches[1]))."\">".$matches[1]."</a>";

【讨论】:

    猜你喜欢
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多