我正在使用 PHP,我的文本如下:
first [abc] middle [xyz] last
我需要得到括号内外的内容。在 StackOverflow 中搜索我发现了一个模式来获取里面的内容:
preg_match_all('/\[.*?\]/', $m, $s)
现在我想知道获取外部信息的模式。
问候!
我正在使用 PHP,我的文本如下:
first [abc] middle [xyz] last
我需要得到括号内外的内容。在 StackOverflow 中搜索我发现了一个模式来获取里面的内容:
preg_match_all('/\[.*?\]/', $m, $s)
现在我想知道获取外部信息的模式。
问候!
您可以将preg_split
其用作:
$input ='first [abc] middle [xyz] last';
$arr = preg_split('/\[.*?\]/',$input);
print_r($arr);
输出:
Array
(
[0] => first
[1] => middle
[2] => last
)
这允许输出中的一些周围空间。如果你不想要它们,你可以使用:
$arr = preg_split('/\s*\[.*?\]\s*/',$input);
preg_split
根据模式拆分字符串。这里的模式[
后面跟着任何东西,后面跟着]
. 匹配任何东西的正则表达式是.*
. 并且是用于 char 类的正则表达式元字符[
。]
由于我们想从字面上匹配它们,我们需要将它们转义以获得\[.*\]
. .*
默认情况下是贪婪的,并且会尝试尽可能多地匹配。在这种情况下,它将匹配abc] middle [xyz
. ?
为了避免这种情况,我们通过附加一个to give使其不贪心\[.*?\]
。因为我们这里任何东西的定义实际上意味着]
我们也可以使用之外的任何东西\[[^]]*?\]
编辑:
如果要提取 内部和外部的单词,[]
可以使用:
$arr = preg_split('/\[|\]/',$input);
[
在 a或 a上拆分字符串]
正如每个人都说您应该使用 preg_split,但只有一个人回答了满足您需求的表达式,我认为这有点复杂- 不复杂,有点冗长,但他已经更新了他的答案来反驳这一点。
这个表达是大多数回复中所说的。
/\[.*?\]/
但这只会打印出来
Array
(
[0] => first
[1] => middle
[2] => last
)
你说你想要大括号内外的东西,更新将是:
/[\[.*?\]]/
这给了你:
Array
(
[0] => first
[1] => abc
[2] => middle
[3] => xyz
[4] => last
)
但正如您所看到的,它也捕获了空白,所以让我们更进一步,摆脱那些:
/[\s]*[\[.*?\]][\s]*/
这将为您提供所需的结果:
Array
(
[0] => first
[1] => abc
[2] => middle
[3] => xyz
[4] => last
)
我认为这是您正在寻找的表达方式。
使用 preg_split 而不是 preg_match。
preg_split('/\[.*?\]/', 'first [abc] middle [xyz] last');
结果:
array(3) {
[0]=>
string(6) "first "
[1]=>
string(8) " middle "
[2]=>
string(5) " last"
}
$inside = '\[.+?\]';
$outside = '[^\[\]]+';
$or = '|';
preg_match_all(
"~ $inside $or $outside~x",
"first [abc] middle [xyz] last",
$m);
print_r($m);
或者不那么冗长
preg_match_all("~\[.+?\]|[^\[\]]+~", $str, $matches)