带有preg_replace的php数组,保持大小写

时间:2016-02-11 02:40:14

标签: php preg-replace

我在php中构建了一个简单的文字过滤器,这里是迄今为止的代码:

function correct_spelling($text) { //     /\b\b/i    
    $a = array('/\bsteph\b/i', '/\bshit\b/i', '/\bfuck\b/i',     "/\bfucken\b/i", '/\benormeous\b/i');
    $b = array('Stephane', 'sh*t', 'f*ck', "f*ckin'", 'enormous');
    return preg_replace($a, $b, $text);
}

它有效,除了我还希望保持原始的大写或小写,所以如果这个人写,例如,#34; Duck,"它应该知道第一个字母是大写的并且返回:

"D*ck" 

而不是

"d*ck"

我如何告诉它尊重'原案件?

2 个答案:

答案 0 :(得分:2)

您可以更改替换规则以使用以下内容:

preg_replace('/(Vulg)a(rity)/i','$1*$2',$text);

因此它只替换了单词的一小部分而不是改变整个单词

这将取代单词为Vulg * rity

答案 1 :(得分:0)

这是我提出的,非常简单,原始单词必须与更改后的单词长度相同,如果它们的长度不同,则仅使用更改后的单词:

<?php
function correct_spelling($text) {
    $text = 'FUcK';
    $a = array('/\bsteph\b/i', '/\bshit\b/i', '/\bfuck\b/i',  "/\bfucken\b/i", '/\benormeous\b/i');
    $b = array('Stephane', 'sh*t', 'f*ck', "f*ckin'", 'enormous');
    $filteredText = preg_replace($a, $b, $text);
    $cleanedText = $filteredText;
    if (strlen($text) == strlen($filteredText)) {
        $count = strlen($text);
        $cleanedText = "";
        for ($i=0; $i < $count; $i++) {
            if (ctype_upper($text[$i]) && $filteredText[$i] != '*') {
                $cleanedText .= $text[$i];
            } else {
                $cleanedText .= $filteredText[$i];
            }
        }
    }
    return $cleanedText;
}
?>

这是一个独立的示例,您可以粘贴到空的PHP文件中:

$text = 'FUcK';
$a = array('/\bsteph\b/i', '/\bshit\b/i', '/\bfuck\b/i',  "/\bfucken\b/i", '/\benormeous\b/i');
$b = array('Stephane', 'sh*t', 'f*ck', "f*ckin'", 'enormous');
$filteredText = preg_replace($a, $b, $text);
$cleanedText = $filteredText;
if (strlen($text) == strlen($filteredText)) {
    $count = strlen($text);
    $cleanedText = "";
    for ($i=0; $i < $count; $i++) {
        if (ctype_upper($text[$i]) && $filteredText[$i] != '*') {
            $cleanedText .= $text[$i];
        } else {
            $cleanedText .= $filteredText[$i];
        }
    }
}
echo $cleanedText;