正则表达式的PHP子串匹配,并且正则表达式并不总是有效

时间:2011-08-31 20:31:49

标签: php regex

我正在尝试创建一个像BBCode这样的html解析器。 例如,我想用以下格式解析html文本中的项目: .....html..... [I]Item1[/I].....html....[I]Item2[/I]......
所以我使用正则表达式来获取[I]XXXXX[/I]我也希望正则表达式只返回Item1以避免str_replace。目前,我使用str_replace [I] ""[/I] ""来获取Item1。问题是正则表达式并不总是有效 我正在使用下面的代码:

$pattern="/\[I]([^\[].)+\[\/I]/m";
preg_match_all($pattern,$string,$out,PREG_SET_ORDER);
foreach($out as $i)
{
    $temp=$i[0];
    echo "Found!";
    $i[0]=str_replace("[I]","",$i[0]);
    $i[0]=str_replace("[/I]","",$i[0]);
    ......
}

我的正则表达式意味着:从[I]开始,除了[之外的所有字符(以避免[I] [I] [/I] [/I])并以[/I]结尾。某些字符串失败,例如aaaaa,其他字符串如aaa aa被找到!也许有更好的方法来创建这样的HTML解析器?
谢谢!

编辑:好的,我找到了解决方案,但我无法理解为什么这不起作用! 解决方案是$pattern='#\[i\](.*?)\[/i\]#is',但差异是什么?

编辑2:Raider是正确的([^\[.)+]主要问题。这将创建语言[I](a)^2n[/I],因此它将与[I]aa[/I]匹配,但不会与[I]aaaaa[/I]匹配!

3 个答案:

答案 0 :(得分:1)

尝试使用以下内容:

$parsed_str = '[I]Item1[/I].....html....[I]Item2[/I].....';
preg_match_all('~\[I\]([^\[.]+?)\[\/I\]~i', $parsed_str, $result);
print_r($result[1]);

同样的结果是:

preg_match_all('~\[I\]([^\[].+?)\[\/I\]~i', $parsed_str, $result);

答案 1 :(得分:1)

我认为您的子模式([^\[].)+是问题所在。试试([^\[]+)

答案 2 :(得分:1)

你的问题在线

$temp=$i[0];

索引0包含整个匹配的模式。相反,您需要使用索引1 - 正则表达式的第一个括号部分:

$temp = $i[1]