首页 > 解决方案 > 使用 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);

有效/无效

补充说明

我的猜测

我的猜测是每个字符都需要循环和检查。如果它以 a 开头",它需要将字符步进到下一个"以便将其换行。然后我想它需要从该位置重置以查看下一个类型的引号是什么并再次设置它直到字符串有结束了。

Stackoverflow上不起作用的答案

这个答案对我的问题不起作用: 则表达式匹配单引号或双引号中的文本

可以在这里看到一个证明:https ://regex101.com/r/OVdomu/65/

标签: phpregexstringtextquotes

解决方案


您可以使用

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

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

也支持转义引号的变体:

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

请参阅此正则表达式演示

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


推荐阅读