2014-01-15 49 views
2

我从我的数据库中得到很多文本值,需要在需要引用字符之前添加斜线输出。只有在前面没有添加斜线时才会用addslashes()

问题是,一些数据已经从前面添加了斜杠,而其中一些没有。

如何使用例如addslashes()添加斜杠 - 但同时确保在斜杠已添加的情况下不会添加额外的斜杠?

实施例:

Input: <a href="test.html">test</a> 
Output should be: <a href=\"test.html\">test</a> 

Input: <a href=\"test.html\">test</a> 
Output should be: <a href=\"test.html\">test</a> 

这是PHP 5.3.10。

回答

1

如果您知道您没有任何双斜杠,只需运行addslashes(),然后将所有\\替换为\

+0

如果存在具有多于2个反斜线的可能性吨,可以考虑使用一个递归函数,并用'strpos检查()'。 – Mave

1

如果你有这样的事情:

<a href=\"test.html\">test</a> 

使用和addslashes(),输出将是:

<a href=\\\"test.html\\\">test</a> 

所以,你可能需要更换一个以上的每次出现\可以肯定

0
function addslashes($string) { 
    return preg_replace('/([^\\\\])\"/','$1\"',$string); 
} 
0

Qaflanti的答案是正确的,但我想m让它更完整,如果你想逃避单引号和双引号。

第一种选择:

function escape_quotes($string) { 
    return preg_replace("/(^|[^\\\\])(\"|')/","$1\\\\$2", $string); 
} 

输入

我爱\ “carots \”,而是 “我” 不喜欢\ '樱桃\'

输出

我爱\ “carots \”,但是\ “I \” 唐\ '吨像\' 樱桃\”

说明:

\有在引用的表达式中有特殊含义,并且会在字符串中转义下面的字符,所以虽然您需要在正则表达式中编写\\以搜索反斜杠字符,但在PHP中,您还需要转义这两个反斜杠,总共4个反斜杠。

考虑到这一点

所以,第一个捕获组,然后搜索单个字符不是反斜线(而不是两个或四个反斜杠具有误导性,因为它是)

第二个捕获组将搜索双倍或单引号 恰好一次。

因此,这会找到未转义的引号(双精度和单精度)并在引号之前添加一个反斜杠,从而转义它。

Regex visual explanation

第二个选项:

或者,它可能只是对你最好将它们转换为HTML从一开始就实体:

function htmlentities_quotes($string) { 
    return str_replace(array('"', "'"), array("&quot;", "&apos;"), $string); 
} 

然后你只需要使用php函数htmlspecialchars_decode($string);将其恢复为原来的样子。

输入

我爱 “carots”,而是 “我” 不喜欢 '樱桃'

输出

我爱&quot; carots &quot;&quot; I &quot; don &apos;&apos;樱桃&apos;

+1

我没有downvote,但我认为至少第一个代码块需要解释(特别是使用正则表达式)。 – BDL

+0

好吧我会编辑解释 – Tofandel

+0

@BDL完成解释 – Tofandel

相关问题