首页 文章

带引号的带引号的字符串由另一个引号(两个双引号)引用

提问于
浏览
0

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

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

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

My Issue 是我的报价被另一个报价转义 . 例:

="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)

给出的示例只是字符串可能看起来像的插图,而不是我将匹配的实际字符串,其数量可以达到数万 .

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

UPDATE 5/5/14:

See Answer Below

2 回答

  • 1

    Edit: 根据您的要求,使用少量mod来计算空引号 .

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

    原始解决方案

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

    演示:

    <?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."
    <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"
    )
    
  • 1

    我发现了zx81的模式

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

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

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

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

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

    我必须匹配的最长字符串是28,000个字符,这导致Apache在堆栈溢出时崩溃 . 我不得不增加堆栈大小32MB(linux default is 8mb, windows is 1mb)勉强度日!我不想让每个线程有这样大的堆栈大小,所以我开始寻找更好的解决方案 .

    实施例(对Regex101测试):这需要6637个步骤,使用$ re_dq_answer匹配的字符串(长度= 3200)现在要求使用$ re_dq_modified 141个步骤 . 我会说稍微改进一下!

相关问题