【问题标题】:str_replace doesn't work with slashstr_replace 不适用于斜杠
【发布时间】:2013-01-22 03:58:21
【问题描述】:

由于某种原因,str_replace() 不适用于 /。我正在创建一个函数来接受我正在制作的博客 CMS 的输入和文本区域表单中的独特链接样式。例如,[{http://brannondorsey.com}My Website] 在通过make_link($string); 时将被转换为<a href='http://brannondorsey.com'>My Website</a>。这是我的代码:

function make_link($input){

 $double = str_replace( '"', '&#34', $input);
 $single = str_replace("'", "&#39", $double);
 $bracket_erase = str_replace('[', "", $single);
 $link_open = str_replace('{', '<a href="', $bracket_erase);
 $link_close = str_replace("}", ">", $link_open);
 $link_value = str_replace(']', "</a>", $link_close);

 echo $link_value;
 }

除了] 没有被&lt;/a&gt; 替换之外,一切都正常工作。如果我删除斜线,它将成功地将] 替换为&lt;a&gt;,但是,众所周知,这不会正确关闭锚标记,因此会使{ 和下一个关闭锚标记之间的所有html 内容我的网页一个链接。

【问题讨论】:

  • 我很确定还有其他事情发生,因为这工作正常:echo str_replace(']', '&lt;/a&gt;', ']');
  • 查看源代码,您的浏览器不会将其显示为 html 标签,但源代码会
  • @ExplosionPills 我刚刚尝试了echo str_replace(']', '&lt;/a&gt;', ']');,但它没有回应任何内容。我什至查看了页面源代码并没有找到 标签。

标签: php regex escaping anchor str-replace


【解决方案1】:

您可能想为此走正则表达式路线。

function make_link($link){
    return preg_replace('/\[{(.*?)}(.*?)\]/i', '<a href="$1">$2</a>', $link);
}

【讨论】:

  • 其实我之前没有对正则表达式做过任何事情。 preg_replace('/\[{(.*?)}(.*?)\]/i', '&lt;a href="$1"&gt;$2&lt;/a&gt;', '[{http://brannondorsey.com}My Website]'); 会做什么?
  • 它会返回你想要的链接。 &lt;a href="http://brannondorsey.com"&gt;My WebSite&lt;/a&gt; 如果将其分配给变量。只是您问题的替代解决方案。
  • 如何将其应用于我正在创建的 [{link}link_name] 链接插入?我想我明白这将如何适用于我的具体情况,但我将如何让它用适当的代码替换文本区域中的 [{}] 的所有实例?
  • 更新答案以反映您的功能。
  • 非常感谢!如果使用这个正则表达式,我仍然可以将单引号和双引号转换为十六进制代码吗?还是我必须做其他事情?
【解决方案2】:

我个人在下面建议 Marcus Recck 的 preg_replace 答案,而不是我在这里。

因为浏览器不会显示 html,所以它没有看到,但您可以使用下面的来查看它,并且\或使用浏览器查看源选项

$link_close ="]";

$link_value = str_replace(']', "</a>", $link_close);

echo htmlspecialchars($link_value);//= &lt;/a&gt;

var_dump ($link_value); //=string(4) "" [invisible due to browser, but the 4 tells you its there]

OP函数的最终版本:

function make_link($input){

 $double = str_replace( '"', '&#34', $input);
 $single = str_replace("'", "&#39", $double);
 $bracket_erase = str_replace('[', "", $single);
 $link_open = str_replace('{', '<a href="', $bracket_erase);
 $link_close = str_replace("}", '">', $link_open);
 $link_value = str_replace(']', "</a>", $link_close);

 return $link_value;
 }
echo htmlspecialchars(make_link('[{http://brannondorsey.com}My Website]'));

【讨论】:

  • 这是解决隐形问题的好方法!但是知道为什么我的make_link() 函数不起作用吗?因为现在我们知道它实际上是在替换 ],而不是出了什么问题?
  • @Brannon 我的固定版本:codepad.viper-7.com/pTwc5J 刚刚添加了结束“
  • 感谢您的投票,但我会做下面的 preg_replace,而不是 str_replace *6 my self
猜你喜欢
  • 1970-01-01
  • 2018-07-21
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 2019-03-01
  • 2021-05-06
相关资源
最近更新 更多