我正在使用PHP,我的文字如下:
first [abc] middle [xyz] last
我需要得到括号内外的内容。在StackOverflow中搜索我找到了一个模式来获取内部的内容:
preg_match_all('/\[.*?\]/', $m, $s)
现在我想知道获得外面的模式。
问候!
答案 0 :(得分:4)
您可以将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
。为了避免这种情况,我们将其?
附加到\[.*?\]
,使其变得非贪婪。由于我们对此处的任何内容的def实际上意味着]
以外的任何内容,我们也可以使用\[[^]]*?\]
修改强>
如果您要提取[]
内外的字词,可以使用:
$arr = preg_split('/\[|\]/',$input);
将字符串拆分为[
或]
答案 1 :(得分:2)
使用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"
}
答案 2 :(得分:1)
$inside = '\[.+?\]';
$outside = '[^\[\]]+';
$or = '|';
preg_match_all(
"~ $inside $or $outside~x",
"first [abc] middle [xyz] last",
$m);
print_r($m);
或更简洁
preg_match_all("~\[.+?\]|[^\[\]]+~", $str, $matches)
答案 3 :(得分:1)
正如每个人都说你应该使用preg_split,但只有一个人用满足你需要的表达式回复,我觉得这有点复杂 - 不复杂,有点啰嗦但是他更新了他的答案以反驳这一点。
这个表达是大多数回复所说的。
/\[.*?\]/
但那只打印出来
Array
(
[0] => first
[1] => middle
[2] => last
)
并且你说你想要在大括号内外都有什么,sio更新将是:
/[\[.*?\]]/
这会给你:
Array
(
[0] => first
[1] => abc
[2] => middle
[3] => xyz
[4] => last
)
但是正如你可以看到它也捕获了白色空间,所以让我们更进一步去除那些:
/[\s]*[\[.*?\]][\s]*/
这会给你一个理想的结果:
Array
(
[0] => first
[1] => abc
[2] => middle
[3] => xyz
[4] => last
)
我认为这是你要找的表达方式。