2017-03-17 42 views
1

我正在嘗試使用[secret]標記創建BB代碼。 BB代碼根據用戶級別「redacts」文本。但是,我有一個問題讓它正常工作。preg_replace和str_replace,似乎無法一起使用

我當前的代碼是:

$replace = array(" ", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"); 
    $text = preg_replace('#\[secret\](.*?)\[/secret\]#si', '\1', str_replace($replace, "█", $text)); 

它輸出爲用戶杆:

█████[██████]███████████.[/██████]█████ 

這其中大部分是正確的,但是,它變成了BB標籤和其他一切,是不是假設被編輯。

我已經移動了preg_replace和str_replace的順序,只是無法讓它正常工作。

+1

那是因爲你要替換的單詞'積木 – miken32

回答

1

正如我在評論中所說的,在將它傳遞給正則表達式匹配之前,您也會用塊替換標記。像這樣的東西應該可以做到。 preg_replace_callback()preg_replace()幾乎相同,但是您可以使用函數來說明要替換字符串的內容。

<?php 
$string = "Here is a secret: [secret]foo bar baz[/secret]"; 
$result = preg_replace_callback("/\[secret\](.*?)\[\/secret\]/si", function($matches) { 
    return preg_replace("/[\w ]/i", "&#9608;", $matches[1]); 
}, $string); 
echo $result; 

你可以看到你的原代碼的問題,如果你打破它,以多個步驟:

<?php 
$replace = array(" ", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"); 
$redacted = str_replace($replace, "&#9608;", $text); 
// Clearly, the string "secret" is gone by now, so the regex will never match 
$text = preg_replace('#\[secret\](.*?)\[/secret\]#si', '\1', $redacted); 
+0

驚人secret'。我需要更多地回顧preg_replace_callback,似乎能夠做到神奇的事情。 – Carl

相關問題