簡體   English   中英

PHP正則表達式的子字符串匹配,並且正則表達式並非始終有效

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM