Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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 带引号的字符串,引号被另一个引号替换(两个双引号)_Php_Regex_Double Quotes - Fatal编程技术网

Php 带引号的字符串,引号被另一个引号替换(两个双引号)

Php 带引号的字符串,引号被另一个引号替换(两个双引号),php,regex,double-quotes,Php,Regex,Double Quotes,因此,带引号字符串的正则表达式已被反复求解。这里有一个很好的答案: 似乎是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

因此,带引号字符串的正则表达式已被反复求解。这里有一个很好的答案:

似乎是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日更新:


编辑:根据您的请求,对空报价进行小修改

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

我发现从

结果是在每个匹配字符后进行回溯。我发现我可以根据自己的需要调整问题顶部的模式

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

不需要“s”模式修饰符,因为该模式不使用\s元字符

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


示例(在上测试):一个字符串(长度=3200)需要6637个步骤才能使用$re_dq_进行匹配,而现在需要141个步骤才能使用$re_dq_modified进行匹配。我想说的是略微改进!

您是否希望将blah blah的
许可证密钥作为一个单独的匹配组?不,每一行都应该是一个组您不能替换
”““
by
,然后只抓取所有带引号的字符串?如果在单引号中使用双引号,则无需转义双引号,例如:
preg_match(“/”123 4556 789“Product B v\.24“/”,$subject)
@anubhava您没有遗漏任何东西OP是一个明确的问题。@Kenneth FYI添加了一个演示。让我知道这是否是您想要匹配的,如果不是需要调整的话。在regex101.com上看起来像预期的那样工作。我会在早上的应用程序中尝试is,如果没有问题,我会接受答案。谢谢!您的regex与ev匹配除了一个空字符串“”(我没有指定,但修改了问题)。一个次要的mod说明了这一点(?@Kenneth根据您的请求,我将您请求的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."<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"
)
$re_dq_answer = '/="(?:[^"]|"")*"/'
$re_dq_orignal = '/="[^"\\\\]*(?:\\\\.[^"\\\\]*)*"/s';
$re_dq_modified = '/="([^"]*(?:""[^"]*)*)"/';