Php preg_match只捕获特定的短语

时间:2014-03-11 09:52:55

标签: php regex

示例字符串:

$string = 'text text text text {capture this1, this2} text text text text';

我想使用preg_match,只在数组中获取这些this1this2,而不是其他内容。

我正在尝试这样的事情:

$array = array();
$reg = '/\{capture.*\}/'; //this needs changing
preg_match($reg, $string, $array);
var_dump($array);

这会捕获{capture this1, this2}。如何从正则表达式中排除“{”符号?我正在尝试像.!\{这样的东西,但它给了我错误。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您可以尝试使用以下正则表达式:

/\{(capture[^}]*)\}/

答案 1 :(得分:1)

您可以使用:

$pattern = '~(?:{capture |\G(?<!\A), )\K[^,}]+(?=(})?)~';
$data = 'text text text {capture this1, this2} text text';
$tmp = array();

if (preg_match_all($pattern, $data, $matches, PREG_SET_ORDER)) {
    foreach($matches as $m) {
        $tmp[] = $m[0];
        if (isset($m[1])) {
            $result = $tmp;
            break; 
        }
    }
}
print_r($result);

此模式避免使用此前瞻(?=[^}]*})来检查结束大括号的存在并使用更快的测试(?=(})?)。如果捕获组存在,则表示括号已关闭。

但是我认为Shankar Damodaran方法更简单(也可能更有效)。