[英]PHP Substring of Regular Expression match,and regular expression not always working
我正在嘗試創建類似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]
)以外的任何字符繼續,並以[/I]
結束。 有些字符串失敗,例如aaaaa
而另一些則發現aaa aa
! 也許有更好的方法來創建這樣的HTML解析器?
謝謝!
編輯:好的,我找到了解決方案,但是我不明白為什么這行不通! 解決方案是$pattern='#\\[i\\](.*?)\\[/i\\]#is'
但是有什么區別?
編輯2:Raider是正確的,主要問題是在([^\\[.)+]
。 這將創建語言[I](a)^2n[/I]
因此它將匹配[I]aa[/I]
,但不會匹配[I]aaaaa[/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);
我認為您的子模式([^\\[].)+
是問題。 試試([^\\[]+)
你的問題是對的
$temp=$i[0];
索引0包含整個匹配的模式。 相反,您需要使用索引1-正則表達式的第一個括號部分:
$temp = $i[1]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.