我偶然發現了PHP的preg_replace函數和一些正則表達式模式的一個奇怪的錯誤。我想要做的是替換由括號分隔的自定義標籤,並將其轉換爲HTML。正則表達式必須考慮定製的「填充」標籤,這些標籤將保留在輸出的HTML中,以便在頁面加載時替換它(例如替換站點名稱)。PHP PREG_REPLACE根據順序檢查得出錯誤結果
每個正則表達式模式都可以自行工作,但由於某些原因,如果先檢查其中一種模式,則其中一些將早退出函數。當我偶然發現這一點時,我使用preg_match和一個foreach循環來檢查模式,然後再返回結果 - 所以假設它對每個模式都是新鮮的。
這也沒有工作。
校驗碼:
function replaceLTags($originalString){
$patterns = array(
'#^\[l\]([^\s]+)\[/l\]$#i' => '<a href="$1">$1</a>',
'#^\[l=([^\s]+)]([^\[]+)\[/l\]$#i'=> '<a href="$1">$2</a>',
'#^\[l=([^\s]+) title=([^\[]+)]([^\[]+)\[/l\]$#i' => '<a href="$1" title="$2">$3</a>',
'#^\[l=([^\s]+) rel=([^\[]+)]([^\[]+)\[/l\]$#i' => '<a href="$1" rel="$2">$3</a>',
'#^\[l=([^\s]+) onClick=([^\[]+)]([^\[]+)\[/l\]$#i' => '<a href="$1" onClick="$2">$3</a>',
'#^\[l=([^\s]+) style=([^\[]+)]([^\[]+)\[/l\]$#i' => '<a href="$1" style="$2">$3</a>',
'#^\[l=([^\s]+) onClick=([^\[]+) style=([^\[]+)]([^\[]+)\[/l\]$#i' => '<a href="$1" onClick="$2" style="$3">$4</a>',
'#^\[l=([^\s]+) class=([^\[]+) style=([^\[]+)]([^\[]+)\[/l\]$#i' => '<a href="$1" class="$2" style="$3">$4</a>',
'#^\[l=([^\s]+) class=([^\[]+) rel=([^\[]+)] target=([^\[]+)]([^\[]+)\[/l\]$#i' => '<a href="$1" class="$2" rel="$3" target="$4">$5</a>'
);
foreach ($patterns as $pattern => $replace){
if (preg_match($pattern, $originalString)){
return preg_replace($pattern, $replace, $originalString);
}
}
}
$string = '[l=[site_url]/site-category/ class=hello rel=nofollow target=_blank]Hello there[/l]';
echo $alteredString = $format->replaceLTags($string);
上述 「字符串」 會出來爲:
<a href="[site_url">/site-category/ class=hello rel=nofollow target=_blank]Hello there</a>
當應該站出來爲:
<a href="[site_url]/site-category/" class="hello" rel="nofollow" target="_blank">Hello there</a>
但是,如果將該模式進一步移動到列表中以便更早檢查,它將會正確格式化。
我很難過,因爲它好像每次檢查它時都會覆蓋字符串,即使這沒有意義。
你真的想在這裏'return'? '返回的preg_replace($模式,$取代,$ originalString);'它應該是'$ originalString =的preg_replace($模式,$取代,$ originalString);'這樣的循環能夠繼續處理? – drew010
我想到了,德魯。但只要找不到匹配,foreach循環就應該繼續。如果發現匹配,你不希望循環繼續,它只會浪費CPU資源。這就是爲什麼我告訴它一旦找到它就返回。 我希望得到它拉出屬性名稱和值這樣我就可以有希望能夠通過在標籤的所有屬性回溯一個正則表達式(不管類型:IMG,A,P,股利等),但到目前爲止,我還沒有能夠得到它的成功。上週我花了太多時間在上面。 – rexibit