1

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

这是我的数据:

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

4

2 回答 2

2

preg_match_all正在返回应有的内容。

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

如果您只想要捕获组,则只需忽略第一个元素。

preg_match_all('/hello:"(.*?)"}/', 'hello:"abcdefg"},"other stuff', $arr, PREG_PATTERN_ORDER);
$firstMatch = $arr[1];
于 2013-08-22T20:13:36.940 回答
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)你会看到你有默认数组和他们自己的附加数组中的匹配项。因此,要访问您需要使用的字符串,$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
于 2013-08-22T20:27:57.490 回答