使用 PHP 查找单引号和双引号之间的内容

Find content between both single and double quotes with PHP

提问人:Jens Törnell 提问时间:11/20/2019 最后编辑:Jens Törnell 更新时间:11/20/2019 访问量:476

问:

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/

PHP 正则表达式 字符串 文本 引号

评论

0赞 Jens Törnell 11/20/2019
@NigelRen 不,它没有。我更新了他的演示,它几乎包装了所有的字符串,因此工作方式与我希望的不同。regex101.com/r/OVdomu/65
0赞 Jens Törnell 11/20/2019
@WiktorStribiżew我在这里测试了你的正则表达式:regex101.com/r/WSaYeh/1 我对它的效果感到惊讶。我试图让它破裂,但不能。你看到它有什么陷阱吗?
0赞 Wiktor Stribiżew 11/20/2019
与无效(不均匀的引号)案例的中断。preg_match_all('~(?|"([^"]*)"|\'([^\']*)\')~', $txt, $matches); print_r($matches[1]);
0赞 Jens Törnell 11/20/2019
@WiktorStribiżew 如果它是无效的,反正它坏了,所以这对我来说很好。如果您愿意,可以将其添加为答案。
1赞 bobble bubble 11/20/2019
@JensTörnell 也许这个答案也有帮助(演示)。它还处理内部的转义报价。

答:

1赞 Wiktor Stribiżew 11/20/2019 #1

您可以使用

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

请参阅正则表达式演示PHP 演示

也支持转义引号的变体:

'~(?|"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\')~s'

请参阅此正则表达式演示

是匹配 的分支重置组,然后是 ,然后是 和 之外的任何 0+ 字符,然后是 和 ,然后是 和 之外的任何 0+ 字符,同时将匹配引号之间的所有内容捕获到组 1 中。(?|"([^"]*)"|\'([^\']*)\')"""'''

评论

0赞 Jens Törnell 11/20/2019
我使用第一个。据我所知,它适用于我的所有情况,而且要短得多。这种变化看起来更像是黑客,而不是正则表达式。但很高兴有替代方案,特别是对于将来访问这个问题的其他人。