我尝试过非捕获组选项?:
这是我的数据:
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
答案 0 :(得分:2)
preg_match_all
正在返回完全应该是什么。
第一个元素是与正则表达式匹配的整个字符串。每个其他元素都是捕获组。
如果你只想要捕获组,那么只需忽略第一个元素。
preg_match_all('/hello:"(.*?)"}/', 'hello:"abcdefg"},"other stuff', $arr, PREG_PATTERN_ORDER);
$firstMatch = $arr[1];
答案 1 :(得分:2)
如果您想要一个不同的捕获字符串,则需要更改正则表达式。在这里,我正在寻找在"
冒号字符后面的两个引用"
字符之间的双引号:
。
<?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
,则可以替换除捕获组之外的字符串的所有内容,然后您不需要处理数组(但您需要知道关于正则表达式的更多信息。)
<?php
$string = 'hello:"abcdefg"},"other stuff';
$pattern = '!^[^:]+:"([^"]+)".+$!s';
$new_string = preg_replace($pattern,"$1",$string);
echo $new_string;
?>
<强>输出强>
abcdefg