使用preg_match拆分字符串

时间:2015-01-21 07:33:42

标签: php arrays split preg-match preg-match-all

我有字符串:

$productList="
Saluran Dua(Bothway)-(TAN007);
Speedy Password-(INET PASS);
Memo-(T-Memo);
7-pib r-10/10-(AM);
FBI (R/N/M)-(Rr/R(A));
";

我想要这样的结果:

Array(
[0]=>TAN007
[1]=>INET PASS
[2]=>T-Memo
[3]=>AM
[4]=>Rr/R(A)
);

我用过:

$separator = '/\-\(([A-z ]*)\)/';
preg_match_all($separator, $productList, $match);
$value=$match[1];

但结果是:

Array(
[0]=>INET PASS
[1]=>AM
);

必须有错误的代码,任何人都可以帮忙吗?

3 个答案:

答案 0 :(得分:3)

您的regex不包含您要捕获的文本中可能出现的所有字符。

正确的regex是:

$match = array();
preg_match_all('/-\((.*)\);/', $productList, $match);

解释(从内到外):

  • .*匹配任何内容;
  • (.*)是上面的表达式,用于在$match[1]中捕获匹配项;
  • -\((.*)\);在上下文中就是上述内容:如果前面有-(并且后跟);,则匹配;括号被转义为使用它们的文字值,而不是它们的特殊regex解释;
  • 无需在正则表达式中转义-;它只在字符范围([A-Z],fe)内使用时才有特殊解释,但即使在那里,如果短划线字符(-)恰好位于[之后或恰好位于]之前{1}}那么它没有特别的意义;例如[-A-Z]表示:短划线(-)或任何大写字母(AZ)。

现在,print_r($match[1]);看起来像这样:

Array
(
    [0] => TAN007
    [1] => INET PASS
    [2] => T-Memo
    [3] => AM
    [4] => Rr/R(A)
)

答案 1 :(得分:0)

尝试使用此ReGex

$separator = '#\-\(([A-Za-z0-9/\-\(\) ]*)\)#';

答案 2 :(得分:0)

对于第1行,您需要0-9

对于第3行,您需要a - in和

在你需要的最后一行() 试试这个

 #\-\(([a-zA-Z/0-9(\)\- ]*)\)#