0

我正在尝试在引号内获取字符串。我正在使用正则表达式,但我遇到了转义引号的问题。

例如,我有这个:

$var = "SELECT * FROM TABLE WHERE USERNAME='Carasuman'";
preg_match_all('~([\'"])(.*?)\1~s', $var, $result);
$new = preg_replace('~([\'"])(.*?)\1~s',"<#################>",$var);

代码完美运行。我在 $result[1] 中获得了 $new 中的替换值和引用值

$new = "SELECT * FROM TABLE WHERE USERNAME=<#################>";
$result[1] = "Carasuman";

我的问题是当我在引号内添加一个转义引号时:

$var = "SELECT * FROM TABLE WHERE USERNAME='Carasuman\'s'";

我懂了:

$new = "SELECT * FROM TABLE WHERE USERNAME=<#################>'s";
$result[1] = "Carasuman\" //must be "Carasuman\'s";

如何避免此错误并像第一个示例一样获得 $new 和 $result[1] ?:

$new = "SELECT * FROM TABLE WHERE USERNAME=<#################>";
$result[1] = "Carasuman\'s";

谢谢!

4

3 回答 3

1

对于比赛,如果没有 \ 作为单个匹配元素,您将永远不会得到Carasuman,因为您可以在单个匹配中让匹配跳过字符。它要么抓住Carasuman要么Carasuman

只需使用 str_replace 来摆脱反斜杠

preg_match_all('~([\'"])(.*)\1~s', $var, $result);
$result[2] = str_replace('\\','',$result[2]);

对于替换,?在 (.*?) 组中使其变得不贪婪,这意味着它将在第一场比赛中停止。去除那个 ?in (.*?) 使其变得贪婪,这意味着它将一直持续到最后一场比赛

preg_replace('~([\'"])(.*)\1~s',"<#################>",$var);

编辑

与其在 $result[2] 上的匹配之后执行 str_replace,不如事先在初始字符串上执行,例如:

$var = str_replace("\\'","'",$var); 
preg_match_all('~([\'"])(.*)\1~s', $var, $result);
$new = preg_replace('~([\'"])(.*)\1~s',"<#################>",$var);

You still need to make your wildcard match greedy like (.*?) to (.*) in order to have the apostrophe in the name included in the match/replace instead of being counted as the terminating single quote

于 2012-09-28T21:02:59.813 回答
0

你为什么不这样做:

$var = "SELECT * FROM TABLE WHERE USERNAME='" . mysql_real_escape_string($input) . "'";

我认为你不一定需要做正则表达式。此外, mysql_real_escape_string 正确地转义了您的输入,因此您可以拥有$input = 'Carasuman\'s';$input = "Carasuman's";

于 2012-09-28T20:44:58.887 回答
0

要匹配带引号的字符串,您可以使用正则表达式'\'.*?(?:\\\\.[^\\\\\']*)*\''和四个双引号字符串'".*?(?:\\\\.[^\\\\"]*)*"'

于 2012-09-28T20:49:05.997 回答