【问题标题】:Quoted string with quotes excaped by another quote (two double quotes)带引号的字符串被另一个引号括起来(两个双引号)
【发布时间】:2014-04-28 21:37:31
【问题描述】:

所以引用字符串的正则表达式已经被一遍又一遍地解决了。在这里看到一个很好的答案:https://stackoverflow.com/a/5696141/692331

$re_dq = '/"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"/s';

似乎是 PHP 的标准解决方案。

我的问题是我的引用被另一个引用转义了。示例:

="123 4556 789 ""Product B v.24"""

="00 00 F0 FF ""Licence key for blah blah"" hfd.34"

=""

前面的字符串应分别与以下内容匹配:

string '123 4556 789 ""Product B v.24""' (length=31) 

string '00 00 F0 FF ""Licence key for blah blah"" hfd.34' (length=48) 

string '' (length=0) 

给出的示例只是说明字符串的外观,而不是我要匹配的实际字符串,可能有数万个。

我需要一个匹配双引号字符串的正则表达式模式,该字符串可能包含也可能不包含两个双引号的序列。

2014 年 5 月 5 日更新:

See Answer Below

【问题讨论】:

  • 是否要将Licence key for blah blah 作为单独的匹配组?
  • 不,每一行应该是一个组
  • 你不能用'' 替换'""',然后只获取所有引用的字符串吗?
  • 如果在单引号内使用双引号,则不需要转义,例如:preg_match('/"123 4556 789 ""Product B v\.24"""/', $subject)
  • @anubhava 你没有错过任何 OP 的内容,一个明确的问题。

标签: php regex double-quotes


【解决方案1】:

编辑:根据您的要求,使用次要模块来解决空引号。

(?<!")"(?:[^"]|"")*"

原解决方案:

(?<!")"(?:[^"]|"")+"

演示:

<?php
$string = '
"123 4556 789 ""Product B v.24"""
"00 00 F0 FF ""Licence key for blah blah"" hfd.34"';
$regex='~(?<!")"(?:[^"]|"")+"~';
$count = preg_match_all($regex,$string,$m);
echo $count."<br /><pre>";
print_r($m[0]);
echo "</pre>";
?>

输出:

2

Array
(
    [0] => "123 4556 789 ""Product B v.24"""
    [1] => "00 00 F0 FF ""Licence key for blah blah"" hfd.34"
)

【讨论】:

  • @Kenneth FYI 添加了演示。让我知道这是否是您要匹配的内容,如果不是,则需要进行哪些调整。
  • 似乎在 regex101.com 上按预期工作。我会在早上的申请中尝试,如果没有出现问题,我会接受答案。谢谢!
  • 您的正则表达式匹配除了空字符串“”(我没有指定,但修改了问题)之外的所有内容。一个小mod说明了 (?
  • @Kenneth 根据您的要求,我将您要求的模组添加到解决方案中。 :)
【解决方案2】:

我发现zx81的模式

$re_dq_answer = '/="(?:[^"]|"")*"/'

导致在每个匹配的字符后回溯。我发现我可以调整问题最顶部的模式以满足我的需要。

$re_dq_orignal = '/="[^"\\\\]*(?:\\\\.[^"\\\\]*)*"/s';

变成

$re_dq_modified = '/="([^"]*(?:""[^"]*)*)"/';

's' 模式修饰符不是必需的,因为该模式不使用 \s 元字符。

我必须匹配的最长字符串是 28,000 个字符,这导致 Apache 在 stackoverflow 上崩溃。我不得不将堆栈大小增加到 32MB(linux default is 8mb, windows is 1mb) 只是为了勉强!我不希望每个线程都有这么大的堆栈大小,所以我开始寻找更好的解决方案。

示例(在 Regex101 上测试):使用 $re_dq_answer 需要 6,637 步才能匹配的字符串(长度=3,200)现在使用 $re_dq_modified 需要 141 步。我会说略有改进!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    相关资源
    最近更新 更多