2017-04-25 179 views
2

所以我需要重新編寫一些我在庫中找到的舊代碼。Preg替換回調驗證

$text = preg_replace("/(<\/?)(\w+)([^>]*>)/e", 
         "'\\1'.strtolower('\\2').'\\3'", $text); 

    $text = preg_replace("/<br[ \/]*>\s*/","\n",$text); 
    $text = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", 
         $text); 

而且第一個我曾嘗試這樣的:

$text = preg_replace_callback(
    "/(<\/?)(\w+)([^>]*>)/", 
    function($subs) { 
     return strtolower($subs[0]); 
    }, 
    $text); 

我有點糊塗了B/C我不明白這個部分:"'\\1'.strtolower('\\2').'\\3'",所以我不知道是什麼我應該更換它嗎?

據我瞭解第一線尋找標記,並使其小寫的情況下,我有一個像

<B>FOO</B> 

你們可以幫我在這裏有一個明確的數據,如果我的代碼完成正常嗎?

回答

1

$subs是一個數組,其中包含第一個項目中的整個值和後續項目中的捕獲文本。因此,組1的值爲$subs[1],組2的值爲$subs[2]等。$subs[0]包含整個匹配值,並且您向其應用了strtolower,但原始代碼保留了組3值(用​​捕獲,也可能包含大寫字母)完好無損。

使用

$text = preg_replace_callback("~(</?)(\w+)([^>]*>)~", function($subs) { 
    return $subs[1] . strtolower($subs[2]) . $subs[3]; 
}, $text); 

PHP demo

+1

謝謝!我會盡快接受這個答案。 – Uffo