1

使用 auto_link() 将副本从 CMS 控制的页面输出到前端。我在存储的副本中有 2 个电子邮件地址,recruit@ 和 bankrecruit@。

当我查看前端时,第一封电子邮件,recruit@,被自动链接成为一个链接的电子邮件地址,但第二个成为银行,然后是招聘@电子邮件链接。这显然不是我所期望的。

auto_link() 匹配所有的recruit@ 情况,在这种情况下,bankrecruit@ 正在被转换,因为它首先找到recruit@ 并将其转换。

如果我删除recruit@ 然后bankrecruit@ 工作正常。此外,如果我将名称更改为 bank@,那么两个地址都按预期工作。

有解决方案吗?

<p>This is the address a@test.com</p>
<p>This is the second address ba@test.com</p>

脚本是:

auto_link($content)
4

1 回答 1

1

正如@cryptic 所指出的,这是 auto_link 方法中的一个错误。(参见源代码)他们在输出中查找所有电子邮件地址,然后将所有电子邮件地址替换str_replace为锚定版本。所以...

<p>This is the address a@test.com</p>
<p>This is the second address ba@test.com</p>

变成

<p>This is the address <a ...>a@test.com</a></p>
<p>This is the second address b<a ...>a@test.com</a></p>

在第一次通过电子邮件a@test.com。在第二封电子邮件中,他们尝试ba@test.com用锚定版本替换,但str_replace找不到地址,它已经被替换了。

您可以通过以下方式实施自己的修复:

  1. 扩展 URL 助手的 auto_link 方法。查看文档
  2. 将 CodeIgniter 源中的 auto_link 方法复制到新的 Helper 中。
  3. 仅替换第一次出现的字符串。请参阅此 SO 线程

例如:

$str = str_replace($matches['0'][$i], safe_mailto($matches['1'][$i].'@'.$matches['2'][$i].'.'.$matches['3'][$i]).$period, $str);

变成

$str = preg_replace('/' . $matches['0'][$i] . '/', safe_mailto($matches['1'][$i].'@'.$matches['2'][$i].'.'.$matches['3'][$i]).$period, $str, 1);

那应该为你解决它。我建议不要修改系统的 URL_Helper,你以后可能会遇到一些迁移问题。

希望这可以帮助。

于 2013-01-15T14:58:53.157 回答