RegEx UTF-8忽略和加粗特殊字符

时间:2012-12-05 20:49:53

标签: php regex preg-replace

我的网站搜索框中有以下代码:

<? echo preg_replace("/({$term})/i", "<b>$0</b>", NoticiaInfo($news_results, 'subtitulo')); ?>

我想知道是否有任何方法可以制作,例如,字母“c”用正则表达式替换“ç”。

所以,如果我搜索“ca”,“Função”的字母“çã”将以粗体显示......

有没有办法用正则表达式做到这一点?

2 个答案:

答案 0 :(得分:1)

您需要将preg_replace与数组一起使用。尝试:

<?php
    $replacements = array(
        '/a/' => '<b>ã</b>',
        '/c/' => '<b>ç</b>'
    );
    echo preg_replace(array_keys($replacements), array_values($replacements),  NoticiaInfo($news_results, 'subtitulo')); 
?>

并使用您要替换的其他字符填写$replacements数组。

@Ranty提出了一个很好的观点,因此您可以尝试使用str_replace,而您的代码将成为:

<?php
    $replacements = array(
        'a' => '<b>ã</b>',
        'c' => '<b>ç</b>'
    );
    echo str_replace(array_keys($replacements), array_values($replacements),  NoticiaInfo($news_results, 'subtitulo')); 
?>

答案 1 :(得分:0)

没有办法做到这一点并保留重音标记。首先,您必须使用替换字符汇总搜索字词的所有可能排列列表。

<?
$termList = array($term);

// You'll need to programmatically create this list
// This is just a sample, assuming that $term == 'Funcao';
$termList[] = 'Funcão';
$termList[] = 'Funçao';
$termList[] = 'Função';

$bodyText = NoticiaInfo($news_results, 'subtitulo');

foreach($termList as $searchTerm) {
    $bodyText = preg_replace("/({$searchTerm})/i", "<b>$0</b>", $bodyText);
}

echo $bodyText;

?>

以编程方式创建搜索词数组将是一场噩梦,但是有许多密码破解应用程序已经这样做(例如:它们为数字创建子字符并创建其每个排列)因此逻辑存在于某处。但是,当你开始获得更长的搜索字符串时,开销就会失控。

当然,如果你不关心保持重音标记,那就容易了。