PHP,我如何“提取”方括号之间的所有子串?

时间:2018-01-30 15:56:52

标签: php regex

假设我有一个字符串:

"there are some words, [other, could, be, here] then other words [and,more,here]."

"[one,two,three] something outside [than, more here, and more]."

我想要一个括号组的数组,如:

Array ( [0] => [other, could, be, here] [1] => [and,more,here] )

或以后我可以使用的任何东西,一个对象也应该没问题。 实际上我已经尝试了一些正则表达式,但没有运气,似乎我不能接受多个组,或者如果字符串以匹配开头则有问题。

已经用于此的正则表达式是:

'/(\[\S+)\s(\S+\])/i'
'/\[([^]]+)\]/i'
'/\[(.*?)\]/i'

我做错了什么?

5 个答案:

答案 0 :(得分:1)

期待"不是什么"介于[]

之间

preg_match_all( '#\[([^\]]+)\]#', $string, $matches_array );

print_r( $matches_array );

... OR

期待"某事或可能没有"在[]之间

preg_match_all( '#\[([^\]]*?)\]#', $string, $matches_array );

同样......将你的反引用括号()放在要捕获的位置周围(你真的想要捕获括号吗?)

答案 1 :(得分:1)

如果你必须使用正则表达式然后忽略这个答案,但这是另一种方式:

$str="there are some words, [other, could, be, here] then other words 
[and,more,here].";
$found=array();
$foundcount=0;
for($i=0;$i<strlen($str);$i++){
    if($str[$i]=='['){
        $found[$foundcount]="";
        for($j=$i;$j<strlen($str);$j++,$i++){
            $found[$foundcount].=$str[$j];
            if($str[$j]==']'){
                $foundcount++;
                break;
            }
        }
    }
}

答案 2 :(得分:1)

如果你想保留方括号并且必须有一个子字符串,你可以这样做:

\[[^[]+\]

<强>解释

  • 匹配方括号 <Dependencies> <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14316.0" MaxVersionTested="10.0.14316.0" /> </Dependencies>
  • 一次或多次匹配方括号(如果必须有子字符串,或者使用PS C:\Users\XXXXX\> [System.Environment]::OSVersion.Version Major Minor Build Revision ----- ----- ----- -------- 10 0 10240 0 代替\[来匹配空括号[]) {{ 1}}
  • 匹配结束方括号*

例如:

+

Output php example

如果您想在方括号内匹配,可以使用

(?<=\[).*?(?=\])

Output php example

答案 3 :(得分:1)

尝试以下方法:

std::unordered_map

示例:

/\[[^\]]*\]/

输出:

$str = "there are some words, [other, could, be, here] then other words [and,more,here].";

preg_match_all('/\[[^\]]*\]/', $str, $matches);
$matches = $matches[0];
print_r($matches);

答案 4 :(得分:0)

试试这个正则表达式:

$str= "[one,two,three] something outside [than, more here, and more].";

preg_match_all("/\[[^\]]*\]/", $str, $matches);
var_dump($matches[0]);