我正在尝试创建一个像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]
匹配!
答案 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]