用于匹配字符串中单引号单词并忽略转义单引号的正则表达式模式

Ive*_*lin 2 php regex preg-match

我的 PHP 代码如下所示:

$input = "City.name = '纽约'";
$literal_pattern = '/\'.[^\']*\'/';
preg_match($literal_pattern, $input, $token);
回声 $token[0]; // 打印“纽约”

我的正则表达式需要使用转义的单引号获取文字,例如:

$input = "City.name = '纽约\'纽约'";
$literal_pattern = ???????????;
preg_match($literal_pattern, $input, $token);
回声 $token[0]; // 应该打印 'New \' York'

$literal_pattern 的规则是什么?

rai*_*7ow 6

没有这个条件,简单...

/('[^']*')/
Run Code Online (Sandbox Code Playgroud)

...当然就足够了:匹配“单引号,后跟任意数量的非单引号符号,再后跟单引号”的所有序列。

但是因为我们需要为两件事做好准备——“正常”和“逃逸”。所以我们应该在我们的模式中添加一些香料:

/('[^'\\]*(?:\\.[^'\\]*)*')/
Run Code Online (Sandbox Code Playgroud)

它可能看起来很奇怪(确实如此),但实际上也很简单:匹配...的序列

  • 单引号符号...
  • ...后跟零个或多个“正常”字符(不是'\),
  • ...后跟(“转义”符号,然后是零个或多个“正常”符号)的子表达式,重复 0 次或多次...
  • 后跟单引号符号。

例子:

$input   = "City.name = 'New \\' York (And Some Backslash Fun)\\\\'\\'"; 
# ...as \' in any string literal will be parsed as a _single_ quote

$pattern = "/('[^'\\\\]*(?:\\\\.[^'\\\\]*)*')/";
# ... a choice: escape either slashes or single quotes; I choose the former

preg_match($pattern, $input, $token);
echo $token[0]; // 'New \' York (And Some Backslash Fun)\\'
Run Code Online (Sandbox Code Playgroud)