php - 使用 PHP 在单引号和双引号之间查找内容
问题描述
My text "can contain" both single 'and double"' quotes. The quotes "can also be 'nested" as you can see.
预期成绩
(包含 3 个项目的数组)
can contain
and double"
can also be 'nested
我已经走了多远
我不是正则表达式专家,远非如此。我仍然设法在双引号之间获取文本,例如I can "grab this" text
.
preg_match_all("~\"(.*?)\"~", $text, $between);
print_r($between);
有效/无效
- 有效:(
This is "A text"
文本) - 有效:(
This is 'A text'
文本) - 有效:(
This is "A 'text"
一个'文本) - 有效:
This is 'A "text'
(A“文本) - 无效:(
This is "A text
单引号1) - 无效:(
This is 'A text
单引号1) - 无效:(
This is "A "text"
不均匀引号 3) - 无效:(
This is 'A 'text'
不均匀引号 3) - 无效:(
This "is ' A " text'
相交)
补充说明
- 如果有错误,比如一个非封闭的报价,如果它打破了(
This "has "one wrong" quote
) - 我更喜欢正则表达式解决方案,但如果有更好的非正则表达式解决方案,那很好。
我的猜测
我的猜测是每个字符都需要循环和检查。如果它以 a 开头"
,它需要将字符步进到下一个"
以便将其换行。然后我想它需要从该位置重置以查看下一个类型的引号是什么并再次设置它直到字符串有结束了。
Stackoverflow上不起作用的答案
这个答案对我的问题不起作用: 正则表达式匹配单引号或双引号中的文本
可以在这里看到一个证明:https ://regex101.com/r/OVdomu/65/
解决方案
您可以使用
if (preg_match_all('~(?|"([^"]*)"|\'([^\']*)\')~', $txt, $matches)) {
print_r($matches[1]);
}
也支持转义引号的变体:
'~(?|"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\')~s'
请参阅此正则表达式演示。
这(?|"([^"]*)"|\'([^\']*)\')
是一个分支重置组,匹配其中一个"
,然后是除"
a"
或 a之外的任何 0+ 个字符,然后是除and之外的任何 0+ 个'
字符,同时将匹配引号之间的所有内容捕获到组 1 中。'
'
推荐阅读
- c# - C#:安全地遍历嵌套属性而不会出错
- audiokit - Swift - 带有振荡器的 AudioKit 音序器(AKOscillatorBank). 频率不会在更高的范围内播放(MidiNote 120+)
- python - 在 Kubernetes 集群中使用 Python 设置 Prometheus
- javascript - 使用数组防止基于值的if语句
- amazon-web-services - AWS Elasticsearch 集群磁盘空间在数据实例之间不平衡
- java - 无法显示椭圆
- python - 如何设置具有任意运行次数的 Tensorboard?
- java - 从 getIntent.getParcelableExtra 中的文本视图获取值时出错
- javascript - UnhandledPromiseRejectionWarning 尽管有多次错误检查
- javascript - 如何防止无效输入