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