addslashes()只有在之前没有添加斜杠的情况下

时间:2014-01-15 14:41:07

标签: php php-5.3

我从我的数据库中获取了大量文本值,我需要在需要引用的字符之前添加斜杠来输出。

问题是某些数据之前已经添加了斜杠,而有些则没有。

如何使用例如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。

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

如果你有这样的话:

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

使用addslashes(),输出将为:

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

因此,您可能需要更换多个\的每个匹配项以确保

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

第一个选项:

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

输入

  

我喜欢“carots”,但“我”不喜欢“樱桃”

输出

  

我喜欢“carots”但是“我不喜欢樱桃”

说明:

  

\在带引号的表达式中具有特殊含义,并且会转义字符串中的后续字符,因此您需要在正则表达式中编写\\来搜索反斜杠字符, 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;&quot;不要&apos;喜欢   &apos; {樱桃{1}}