Php 带引号的字符串,引号被另一个引号替换(两个双引号)
因此,带引号字符串的正则表达式已被反复求解。这里有一个很好的答案: 似乎是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
="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 = '/="([^"]*(?:""[^"]*)*)"/';