在PHP中用Regex匹配括号内的文本

时间:2011-03-30 22:37:12

标签: php regex

我有一些文字:

name:  [my_name]
email: [my_email]

我想用正则表达式抓住方括号中的字段 - 我该怎么做? 我尝试过使用这种模式:[*.?]

不幸的是它不起作用。 PHP给出了这个错误:

compilation failed: nothing to repeat at offset 0

怎么了?模式是否正确?

5 个答案:

答案 0 :(得分:3)

括号是正则表达式中的特殊字符。为了匹配它们,你必须用反斜杠逃脱它们。像\[(.*?)\]这样的东西。添加parens ()会捕获其中匹配的内容,以便您以后可以使用它。否则你只是匹配整个模式,你必须手动剥离括号。

答案 1 :(得分:1)

你应该移动*并逃避[和]。所以,让它成为\[.*\]。匹配任何字符已经和*说:0或更多的字符。所以。*是0或更多的任何char

答案 2 :(得分:1)

不,你订单错了。它应该像

\[(.*)\]

。* =重复的次数尽可能多。

你得到的编译错误是因为编译器现在没有重复的内容,因为[是正则表达式中的特殊字符。您添加的?也不允许括号内的任何内容,我认为您不需要,所以我删除了它。问号使上述陈述成为可选的。 .*的括号aroudn用于捕获结果。如果你不添加它们,正则表达式将匹配,但你不会得到括号内的结果。

答案 3 :(得分:1)

<?php
$text =
"name:  [my_name]
email: [my_email]";

$pattern = '/\[(.*)\]/';
$matches = array();

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

$name = $matches[1][0];
$email = $matches[1][1];

print "$name<br />";
print "$email";
?>

将输出

my_name
my_email

/是分隔符(不是实际模式本身的一部分)。 \用于转义[]括号,因为它们在未转义时在模式中定义字符类定义()定义子模式,这意味着子模式捕获的文本将被放入由preg_match_all的第三个参数引用的数组中(在本例中为$matches)。

答案 4 :(得分:0)

逃脱它!

[]个特殊字符,因此您需要转义它们:

\[*.?\]