提问人:Jens Törnell 提问时间:11/20/2019 最后编辑:Jens Törnell 更新时间:11/20/2019 访问量:476
使用 PHP 查找单引号和双引号之间的内容
Find content between both single and double quotes with 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'
- Valid:(文本)
This is "A 'text"
- 有效:(“文本”)
This is 'A "text'
- 无效:(不均匀的引号 1)
This is "A text
- 无效:(不均匀的引号 1)
This is 'A text
- 无效:(不均匀的引号 3)
This is "A "text"
- 无效:(不均匀的引号 3)
This is 'A 'text'
- Invalid:(相交)
This "is ' A " text'
其他说明
- 如果有错误,比如非闭合报价,如果它中断也没关系(
This "has "one wrong" quote
) - 我更喜欢正则表达式解决方案,但如果有更好的非正则表达式解决方案,那很好。
我的猜测
我的猜测是每个字符都需要循环和检查。如果它以 a 开头,则需要将字符单步执行到下一个字符才能将其包装起来。然后我想它需要从该位置重置以查看下一种类型的报价是什么,然后再次重置,直到字符串结束。"
"
Stackoverflow 上不起作用的答案
这个答案不适用于我的问题:正则表达式匹配单引号或双引号中的文本
可以在这里看到一个证明:https://regex101.com/r/OVdomu/65/
答:
1赞
Wiktor Stribiżew
11/20/2019
#1
您可以使用
if (preg_match_all('~(?|"([^"]*)"|\'([^\']*)\')~', $txt, $matches)) {
print_r($matches[1]);
}
也支持转义引号的变体:
'~(?|"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\')~s'
请参阅此正则表达式演示。
是匹配 的分支重置组,然后是 ,然后是 和 之外的任何 0+ 字符,然后是 和 ,然后是 和 之外的任何 0+ 字符,同时将匹配引号之间的所有内容捕获到组 1 中。(?|"([^"]*)"|\'([^\']*)\')
"
"
"
'
'
'
评论
0赞
Jens Törnell
11/20/2019
我使用第一个。据我所知,它适用于我的所有情况,而且要短得多。这种变化看起来更像是黑客,而不是正则表达式。但很高兴有替代方案,特别是对于将来访问这个问题的其他人。
评论
preg_match_all('~(?|"([^"]*)"|\'([^\']*)\')~', $txt, $matches); print_r($matches[1]);