对不起,伙计们,也许我的问题真的很傻,但是我被困了......再次以正则表达式......
看,我有一个变量,例如:
$str = "[quote]Here I am 2013[/quote]";
$rega = preg_match_all("/[quote](.*)[quote]/i",$str,$hols);
当我尝试获得$ hols变量时,我会得到类似的结果:
quote]这是我2013年[/ quote
但我需要这样的事情:
我在2013年
第二个问题是当我试图从$ str获得
$str = "[quote]Hello people
this
is
my...[/quote]";
所以,通过我的正则表达式,我得到类似的内容:
quote]Hello people
但我需要:
Hello people
this
is
my...
如果你能向我解释如何处理它,如何使它正确,我真的很感激。因为我不知道如何解决它。
答案 0 :(得分:2)
preg_match_all("/[quote](.*)[quote]/i",$str,$hols);
^--- missing / there
另外,您可能想要:
"/\[quote\](.*?)\[\/quote\]/mis"
要使它成为:ungreedy,匹配多行,你必须转义[
和]
,因为[quote]
实际定义了一个匹配q,u,o,t和ë
如果您还可以嵌套[quote]
,则必须放弃使用正则表达式,因为嵌套不是无上下文的。正则表达式只能处理无上下文的语法。然后解决方案是构建一个(非常简单的)解析器。
答案 1 :(得分:2)
除了弗里茨所说的,你需要摆脱括号;您目前要求RegEx匹配任何字符'q','u','o','t'或'e',后跟任何内容,然后再重复相同的字符;这场比赛的唯一原因就在于你的表情很贪婪,而Frits的建议会“打破”这个(正确的)。简而言之,像这样逃避括号:
/\[quote\](.*?)\[\/quote\]/mis
考虑您之前的模式:
/[quote](.*)[quote]/i
你要求:
因此,例如,字符串Queen's Charter!
将与Queen's Charte
匹配,内部匹配为ueen's Chart
(因为未捕获第一个和最后一个字符类)。
如果您第二步不贪婪,那么您会得到Qu
,ee
和te
,而根本没有内部匹配。
我运行了以下代码:
preg_match_all(
'/\[quote\](.*?)\[\/quote\]/mis',
"[quote]A test! A Marvelous Test![/quote]",
$matches
);
var_dump($matches);
得到以下结果:
array (size=2)
0 =>
array (size=1)
0 => string '[quote]A test! A Marvelous Test![/quote]' (length=41)
1 =>
array (size=1)
0 => string 'A test! A Marvelous Test!' (length=26)