Php 我能';我不能正确使用正则表达式
对不起,伙计们,也许我的问题真的很傻,但我还是被正则表达式卡住了 看,我有一个变量,例如:Php 我能';我不能正确使用正则表达式,php,expression,preg-match-all,Php,Expression,Preg Match All,对不起,伙计们,也许我的问题真的很傻,但我还是被正则表达式卡住了 看,我有一个变量,例如: $str = "[quote]Here I am 2013[/quote]"; $rega = preg_match_all("/[quote](.*)[quote]/i",$str,$hols); 当我尝试获取$hols变量时,我得到如下结果: $str = "[quote]Hello people this is my...[/quote]"; quote]Hello people He
$str = "[quote]Here I am 2013[/quote]";
$rega = preg_match_all("/[quote](.*)[quote]/i",$str,$hols);
当我尝试获取$hols变量时,我得到如下结果:
$str = "[quote]Hello people
this
is
my...[/quote]";
quote]Hello people
Hello people
this
is
my...
我在这里
但我需要这样的东西:
$str = "[quote]Hello people
this
is
my...[/quote]";
quote]Hello people
Hello people
this
is
my...
我在这里
第二个问题是当我试图从$str获取时:
$str = "[quote]Hello people
this
is
my...[/quote]";
quote]Hello people
Hello people
this
is
my...
因此,通过正则表达式,我得到如下结果:
$str = "[quote]Hello people
this
is
my...[/quote]";
quote]Hello people
Hello people
this
is
my...
但我需要:
$str = "[quote]Hello people
this
is
my...[/quote]";
quote]Hello people
Hello people
this
is
my...
如果你能向我解释如何处理它,如何使它正确,我将不胜感激。因为我不知道如何修复它
preg_match_all("/[quote](.*)[quote]/i",$str,$hols);
^--- missing / there
此外,您可能需要:
"/\[quote\](.*?)\[\/quote\]/mis"
要使其成为:ungreedy,匹配多行,您必须转义[
和]
,因为[quote]
实际上定义了一个只匹配q、u、o、t和e的字符类
如果您还可以嵌套[quote]
s,则必须避免使用正则表达式,因为嵌套不是上下文无关的。正则表达式只能处理上下文无关的语法。然后,解决方案是构建一个(非常简单的)解析器
此外,您可能需要:
"/\[quote\](.*?)\[\/quote\]/mis"
要使其成为:ungreedy,匹配多行,您必须转义[
和]
,因为[quote]
实际上定义了一个只匹配q、u、o、t和e的字符类
如果您还可以嵌套
[quote]
s,则必须避免使用正则表达式,因为嵌套不是上下文无关的。正则表达式只能处理上下文无关的语法。然后,解决方案是构建一个(非常简单的)解析器。除了Frits所说的,您还需要跳出括号;您当前要求正则表达式匹配任何字符“q”、“u”、“o”、“t”或“e”,后跟任何字符,然后再跟这些相同的字符;匹配如此之大的唯一原因与您的表达式贪婪有关,而弗里茨的建议将“打破”这一点(尽管是正确的)。简言之,像这样避开括号:
/\[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)
除了Frits所说的以外,您还需要跳出括号;您当前正在要求正则表达式匹配任何字符“q”、“u”、“o”、“t”或“e”,后跟任何字符,然后再跟这些相同的字符;匹配如此之大的唯一原因是您的表达式是贪婪的,而Frits“sugg”estion将“打破”这一点(尽管是正确的)。简言之,像这样避开括号:
/\[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)
很抱歉,但是您的变体不起作用,它仍然会返回smth,比如:[quote]大家好,这是我的…[/quote]和[quote]我的意思是您正在查看
$hols[0]
还是$hols[1]
?$hols[0]
将包含完整的匹配项,即整个字符串;$hols[1]
将包含子模式(括号中的部分,在引号标记之间)。有关详细信息,请参阅我最近的编辑。抱歉,但您的变体不起作用,它仍然会返回smth,如:[quote]您好!这是我的…[/quote]和[quote]我的意思是,您是否正在查看$hols[0]
或$hols[1]
?$hols[0]
将包含完全匹配,即整个字符串;$hols[1]
将包含子模式(括号中的部分,引号标记之间)。有关详细信息,请参阅我最近的编辑。+1表示语法分析器;从不嵌套正则表达式。如果你认为可以,则不能。这样,疯狂在于。+1表示语法分析器;从不嵌套正则表达式。如果你认为可以,则不能。这样,疯狂在于。