Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正则表达式的PHP子字符串匹配,并且正则表达式不总是工作_Php_Regex - Fatal编程技术网

正则表达式的PHP子字符串匹配,并且正则表达式不总是工作

正则表达式的PHP子字符串匹配,并且正则表达式不总是工作,php,regex,Php,Regex,我正在尝试创建一个类似BBCode的html解析器。 例如,我想用以下格式解析html文本中的项目: …html。。。。。[一] Item1[/I]…html…[I]Item2[/I]… 因此,我使用正则表达式来获取[I]XXXXX[/I]我还希望正则表达式只返回Item1,以避免str\u replace。目前,我正在使用str\u将[I]替换为”,将[/I]替换为”,以获取项目1。问题是正则表达式并不总是有效。 我正在使用下面的代码: $pattern="/\[I]([^\[].)+\[\/

我正在尝试创建一个类似BBCode的html解析器。 例如,我想用以下格式解析html文本中的项目:
…html。。。。。[一] Item1[/I]…html…[I]Item2[/I]…

因此,我使用正则表达式来获取
[I]XXXXX[/I]
我还希望正则表达式只返回Item1,以避免
str\u replace
。目前,我正在使用
str\u将[I]
替换为
,将
[/I]
替换为
,以获取项目1。问题是正则表达式并不总是有效。
我正在使用下面的代码:

$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]
结束。一些字符串失败,例如
aaaaaaa
,其他字符串也被找到了!也许有更好的方法来创建这样的html解析器?
谢谢大家!

编辑:好的,我找到了解决方案,但我不明白为什么这不起作用! 解决方案是
$pattern='\[i\](.*?\[/i\].\is'
,但有什么区别


编辑2:袭击者是正确的主要问题是
([^\[)+]
。这将创建语言
[I](a)^2n[/I]
,因此它将匹配
[I]aa[/I]
,但不匹配
[I]aaaaaa[/I]

尝试使用类似的方法:

$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);

尝试使用类似以下内容:

$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);

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

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

你的问题已经解决了

$temp=$i[0];
索引0包含整个匹配的模式。相反,您需要使用索引1-regexp的第一个括号部分:

$temp = $i[1]
你的问题已经解决了

$temp=$i[0];
索引0包含整个匹配的模式。相反,您需要使用索引1-regexp的第一个括号部分:

$temp = $i[1]

嗯……你是对的,我无意中创造了兰格[i](aa)^n[/i]!嗯……你是对的,我无意中创造了兰格[i](aa)^n[/i]!