PHP-REGEX: as letras acentuadas combinam com as que não são acentuadas e vice-versa. Como conseguir isso?

Eu quero fazer código de destaque típico. Então eu tenho algo como:

$valor = preg_replace("/(".$_REQUEST['txt_search'].")/iu", "\\1", $valor); 

Agora, a palavra pedido pode ser algo como “josé”. E com isso, eu quero “jose” ou “JOSÉ” ou “José”, etc., também destacados.

Com esta expressão, se eu escrever “josé”, corresponde a “josé” e “JOSÉ” (e todas as variantes do caso). Ele sempre combina apenas com as variantes acentuadas. Se eu procurar “jose”, ele corresponde a “JOSE”, “jose”, “Jose”, mas não aos acentuados. Então eu parcialmente o que eu quero, porque eu tenho insensibilidade a maiúsculas e minúsculas em acentuado e não acentuado separadamente.

Eu preciso disso totalmente combinado, o que significa acento (unicode) insensível, então eu posso procurar “jose” e destacar “josé”, “josÉ”, “José”, “JOSE”, “JOSÉ”, “JoSé”, .. .

Eu não quero fazer uma substituição de acentos na palavra, porque quando eu imprimi-lo na canvas eu preciso ver a palavra real como vem.

Alguma ideia?

Obrigado!

Você pode tentar criar uma function para criar sua expressão regex com base em seu txt_search, substituindo qualquer possível correspondência por todas as possíveis correspondências, como esta:

 function search_term($txt_search) { $search = preg_quote($txt_search); $search = preg_replace('/[aàáâãåäæ]/iu', '[aàáâãåäæ]', $search); $search = preg_replace('/[eèéêë]/iu', '[eèéêë]', $search); $search = preg_replace('/[iìíîï]/iu', '[iìíîï]', $search); $search = preg_replace('/[oòóôõöø]/iu', '[oòóôõöø]', $search); $search = preg_replace('/[uùúûü]/iu', '[uùúûü]', $search); // add any other character return $search; } 

Então você usa o resultado como um regex em seu preg_replace.

Você pode ter que analisar a seqüência de pesquisa e modificar o padrão no regex para que, se inclui casos como [eéÉ]. Substitua todas as instâncias de e / E / é / É com um [eEéÉ] atrativo. Faça o mesmo para todos os outros casos. Então, em seu exemplo, o padrão de busca, em vez de Jose / José / JOSÉ, seria jos[éÉeE]