我有一些文字:
name: [my_name]
email: [my_email]
我想用正则表达式抓住方括号中的字段 - 我该怎么做?
我尝试过使用这种模式:[*.?]
不幸的是它不起作用。 PHP给出了这个错误:
compilation failed: nothing to repeat at offset 0
怎么了?模式是否正确?
答案 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)
[
和]
个特殊字符,因此您需要转义它们:
\[*.?\]