Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php addslashes()仅当未从之前添加斜杠时_Php_Php 5.3 - Fatal编程技术网

Php addslashes()仅当未从之前添加斜杠时

Php addslashes()仅当未从之前添加斜杠时,php,php-5.3,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\"&g

我从数据库中得到了很多文本值,需要在需要引用的字符之前添加斜杠输出

问题是有些数据已经添加了斜杠,而有些数据没有

如何使用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>
输入:
输出应为:
输入:
输出应为:

这是PHP5.3.10。

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

,如果您有类似的内容:

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

使用addslashes(),输出将为:

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


因此,您可能需要替换每次出现的多个\以确保

Qaflanti的答案是正确的,但如果您希望同时转义单引号和双引号,我希望使其更完整

function addslashes($string) {
    return preg_replace('/([^\\\\])\"/','$1\"',$string);
}
第一个选项:

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

我喜欢“卡罗”,但“我”不喜欢“樱桃”

输出

我喜欢“卡诺”,但“我”不喜欢“樱桃”

说明:

function escape_quotes($string) {
    return preg_replace("/(^|[^\\\\])(\"|')/","$1\\\\$2", $string);
}
\
在带引号的表达式中有一个特殊的含义,它将转义字符串中的以下字符,因此,虽然您需要在正则表达式中编写
\
来搜索反斜杠字符,但在php中,您还需要转义这两个反斜杠,总计4个反斜杠

因此,考虑到这一点,第一个捕获组然后搜索一个不是反斜杠的字符(也不是两个或四个误导性的反斜杠)

第二个捕获组将搜索双引号或单引号 就一次

因此,这将查找未转义的引号(双引号和单引号),并在引号之前添加反斜杠,从而对其进行转义

第二选项:

function escape_quotes($string) {
    return preg_replace("/(^|[^\\\\])(\"|')/","$1\\\\$2", $string);
}
或者,最好从一开始就将它们转换为html实体:

function htmlentities_quotes($string) {
    return str_replace(array('"', "'"), array("&quot;", "&apos;"), $string);
}
然后你只需要使用php函数
htmlspecialchars\u decode($string)
将其还原为原来的状态

输入

我喜欢“卡洛特”,但“我”不喜欢“樱桃”

输出

我爱《代码》”
carots
但是
I
don
&apos我不喜欢
&apos樱桃
&apos


如果有超过2个反斜杠的可能性,考虑使用递归函数和检查<代码>约束()/<代码>。我没有投票,但我认为至少第一个代码块需要解释(特别是使用的正则表达式)。