我正在嘗試創建一個輕量級的 BBCode 決議器,而不對每個元素進行硬編碼的正則運算式匹配。我的方法是利用preg_replace_callback()來處理函式中的匹配。
我的簡單但令人沮喪的方法是使用正則運算式對元素名稱進行分組,并使用每個函式的開關決議不同的元素。
這是我的正則運算式模式:
'~\[([a-z] )(?:=(.*))?(?: (.*))?\](.*)(?:\[/\1\])~siU'
這是preg_replace_callback()我必須測驗的。
return preg_replace_callback(
'~\[([a-z] )(?:=(.*))?(?: (.*))?\](.*)(?:\[/\1\])~siU',
function($matches) {
var_dump($matches);
return "<".$matches[1].">".$matches[4]."</".$matches[1].">";
},
$this->raw
);
這個問題難倒了我。正則運算式模式似乎不會遞回匹配,這意味著如果它匹配一個元素,它就不會匹配其中的元素。
以這個 BBCode 為例:
[i]This is all italics along with a [b]bold[/b].[/i]
這只會匹配 [u],不會匹配其中的任何元素,所以它看起來像
這都是斜體和 [b] 粗體 [/b]。
preg_match_all() 繼續表明情況確實如此,我嘗試過使用貪婪的語法和模式。
我該如何解決這個問題?
uj5u.com熱心網友回復:
感謝@Casimir et Hippolyte 的評論,我能夠像他們說的那樣使用 while 回圈和 count 引數來解決這個問題。
基本的正則運算式字串不起作用,因為我想在標簽中使用值[color=red]或[img width=""]。
這是最終的代碼。它并不完美,但它有效。
$str = $this->raw;
do {
$str = preg_replace_callback(
'~\[([a-z] )(?:=([^]\s]*))?(?: ([^[]*))?\](.*?)(?:\[/\1\])~si',
function($matches) {
return "<".$matches[1].">".$matches[4]."</".$matches[1].">";
},
$str,
-1,
$count
);
} while ($count);
return $str;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/386007.html
上一篇:正則運算式不匹配字母后跟數字
下一篇:使用帶符號值的程式集進行計算
