提取字符串上的每个匹配项

时间:2010-05-04 16:08:16

标签: php regex preg-match preg-match-all

我有一个"a-b""c-d""e-f"...形式的字符串 使用preg_match,我如何提取它们并获得一个数组:

Array
(
    [0] =>a-b
    [1] =>c-d
    [2] =>e-f
    ...
    [n-times] =>xx-zz
)

由于

3 个答案:

答案 0 :(得分:3)

你可以这样做:

$str = '"a-b""c-d""e-f"';
if(preg_match_all('/"(.*?)"/',$str,$m)) {
    var_dump($m[1]);
}

输出:

array(3) {
  [0]=>
  string(3) "a-b"
  [1]=>
  string(3) "c-d"
  [2]=>
  string(3) "e-f"
}

答案 1 :(得分:3)

Regexp并不总是最快的解决方案:

$string = '"a-b""c-d""e-f""g-h""i-j"';
$string = trim($string, '"');
$array = explode('""',$string);
print_r($array);

Array ( [0] => a-b [1] => c-d [2] => e-f [3] => g-h [4] => i-j )

答案 2 :(得分:0)

这是我的看法。

$string = '"a-b""c-d""e-f"';

if ( preg_match_all( '/"(.*?)"/', $string, $matches ) )
{
  print_r( $matches[1] );
}

模式细分

"   // match a double quote
(   // start a capture group
.   // match any character
*   // zero or more times
?   // but do so in an ungreedy fashion
)   // close the captured group
"   // match a double quote

您查看$matches[1]而非$matches[0]的原因是因为preg_match_all()返回索引1-9中的每个捕获组,而整个模式匹配位于索引0处。因为我们只想要捕获组中的内容(在本例中是第一个捕获组),我们会看$matches[1]