PHP正则表达式,我如何让我的正则表达式只返回一个组?

时间:2013-08-22 20:03:13

标签: php regex preg-match-all

我尝试过非捕获组选项?:

这是我的数据:

hello:"abcdefg"},"other stuff

这是我的正则表达式:

/hello:"(.*?)"}/

以下是它的回报:

Array
(
    [0] => Array
        (
            [0] => hello:"abcdefg"}
        )

    [1] => Array
        (
            [0] => abcdefg
        )

)

我想知道,我怎么能这样做[0] => abdefg和[1] =>不存在?

有没有办法做到这一点?我觉得它会更清洁,提高我的表现。我知道正则表达式只是做我告诉它要做的事情,它向我显示它找到的整个字符串,以及字符串中的组。但我怎么能让它只返回abcdefg,仅此而已?这可能吗?

感谢。

编辑:我在一个网站上使用正则表达式,说它使用perl正则表达式。我实际上并没有使用perl解释器

再次编辑:显然我误读了网站。它确实使用PHP,并使用此函数调用它:preg_match_all('/hello:"(.*?)"}/', 'hello:"abcdefg"},"other stuff', $arr, PREG_PATTERN_ORDER);

我为这个错误道歉,我修复了标签。

再次编辑2:这是网站http://www.solmetra.com/scripts/regex/index.php

2 个答案:

答案 0 :(得分:2)

preg_match_all正在返回完全应该是什么。

第一个元素是与正则表达式匹配的整个字符串。每个其他元素都是捕获组。

如果你只想要捕获组,那么只需忽略第一个元素。

preg_match_all('/hello:"(.*?)"}/', 'hello:"abcdefg"},"other stuff', $arr, PREG_PATTERN_ORDER);
$firstMatch = $arr[1];

答案 1 :(得分:2)

preg_match_all

如果您想要一个不同的捕获字符串,则需要更改正则表达式。在这里,我正在寻找在"冒号字符后面的两个引用"字符之间的双引号:

<?php

$string = 'hello:"abcdefg"},"other stuff';
$pattern = '!(?<=:")[^"]+(?=")!';

preg_match_all($pattern,$string,$matches);

echo $matches[0][0];

?>

<强>输出

abcdefg

如果您print_r($matches),您会看到default array和匹配在他们自己的附加阵列中。因此,要访问字符串,您需要使用$matches[0][0],它提供了访问数据的两个密钥。但是当你使用preg_match_all时,你总是要处理数组。

Array
(
    [0] => Array
        (
            [0] => abcdefg
        )

)

的preg_replace

或者,如果您要使用preg_replace,则可以替换除捕获组之外的字符串的所有内容,然后您不需要处理数组(但您需要知道关于正则表达式的更多信息。)

<?php

    $string = 'hello:"abcdefg"},"other stuff';
    $pattern = '!^[^:]+:"([^"]+)".+$!s';

    $new_string = preg_replace($pattern,"$1",$string);

    echo $new_string;

?>

<强>输出

abcdefg