使用PHP查找单引号和双引号之间的内容 预期结果

使用PHP查找单引号和双引号之间的内容 预期结果,php,regex,string,text,quotes,Php,Regex,String,Text,Quotes,(包含3项的数组) 我走了多远 我不是正则表达式专家,远非如此。我仍然设法在双引号之间获取文本,如我可以“抓取此”文本 preg\u match\u all(“~\”(.*?\“~”,$text,$between); 打印费用($之间); 有效/无效 有效:这是“文本”(文本) 有效:这是“文本”(文本) 有效:这是“A'文本”(A'文本) 有效:这是一个“文本”(一个“文本”) 无效:这是“文本”(不均匀引号1) 无效:这是一个文本(不均匀引号1) 无效:这是一个“文本”(不均匀引号3)

(包含3项的数组)

我走了多远 我不是正则表达式专家,远非如此。我仍然设法在双引号之间获取文本,如
我可以“抓取此”文本

preg\u match\u all(“~\”(.*?\“~”,$text,$between);
打印费用($之间);
有效/无效
  • 有效:
    这是“文本”
    (文本)
  • 有效:
    这是“文本”
    (文本)
  • 有效:
    这是“A'文本”
    (A'文本)
  • 有效:
    这是一个“文本”
    (一个“文本”)
  • 无效:
    这是“文本”(不均匀引号1)
  • 无效:
    这是一个文本(不均匀引号1)
  • 无效:
    这是一个“文本”
    (不均匀引号3)
  • 无效:
    这是“文本”
    (不均匀引号3)
  • 无效:
    这是一个“文本”
    (相交)
附加说明
  • 如果有错误,如非闭合引号,如果它断开就可以了(
    This“有一个错误的”引号
  • 我更喜欢正则表达式解决方案,但如果有更好的非正则表达式解决方案,也可以
我猜 我猜每个字符都需要循环和检查。如果它以一个
开头,它需要将字符分步到下一个
,以便将其包装。然后我猜需要从该位置重置它,以查看下一个引号类型,并再次将其插入,直到字符串结束

关于Stackoverflow的答案不起作用 这个答案对我的问题不起作用:

这里可以看到一个证明:

您可以使用

can contain
and double"
can also be 'nested
请参阅和

也支持转义引号的变体:

if (preg_match_all('~(?|"([^"]*)"|\'([^\']*)\')~', $txt, $matches)) { 
    print_r($matches[1]);
}


(?|“([^”]*)“\'([^\']*)\”
是一个匹配的
,然后是
以外的任何0+字符,然后是一个
,然后是
以外的任何0+字符,然后是
,同时将匹配引号之间的所有内容捕获到组1中。

@NigelRen否,它没有。我更新了他的演示,它包装了几乎所有的字符串,因此工作方式与我希望的不同@WiktorStribiżew我在这里测试了你的正则表达式:我对它的工作原理感到惊讶。我试图把它弄断,但做不到。你看到它有什么缺陷吗?
preg\u match\u all(“~(?”([^“]*)”([^\']*)\”),$txt,$matches);print\u r($matches[1]);
用无效的(不均匀的引号)来打断。@WiktorStribiżew如果它无效,它无论如何都会被打断,所以这对我来说很好。如果你愿意,可以添加它作为答案。@JensT rnell可能也会有所帮助()。它还处理内部转义引号。我使用第一个。据我所知,它适用于我所有的情况,而且它的长度要短得多。这种变化看起来更像是一种黑客行为,而不是正则表达式。但是有其他选择很好,特别是对于将来访问此问题的其他人。
if (preg_match_all('~(?|"([^"]*)"|\'([^\']*)\')~', $txt, $matches)) { 
    print_r($matches[1]);
}
'~(?|"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\')~s'