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

问题描述 投票:4回答:1
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"(A文本)
  • 有效:This is 'A text'(A文本)
  • 有效:This is "A 'text"(A'文本)
  • 有效: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),就可以了
  • 我更喜欢正则表达式解决方案,但是如果有更好的非正则表达式解决方案,那很好。

我的猜测

我的猜测是每个字符都需要循环和检查。如果以"开头,则需要将字符移至下一个"以便将其换行。然后,我想需要从该位置重置该字符以查看下一个引号类型以及再次,直到字符串结束。

Stackoverflow上的答案不起作用

此答案对不是适用于我的问题:regex match text in either single or double quote

可以在此处看到证明:https://regex101.com/r/OVdomu/65/

php regex string text quotes
1个回答
1
投票

您可以使用

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

请参见regex demoPHP demo

也支持转义引号的变体:

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

请参见this regex demo

(?|"([^"]*)"|\'([^\']*)\')是与branch reset group匹配的",然后与"以外的任何0+字符匹配,然后与"'匹配,然后与'以外的任何0+字符匹配,并且然后单击',同时将匹配的引号之间的所有内容都捕获到组1中。

© www.soinside.com 2019 - 2024. All rights reserved.