2009-08-26 16 views
1

Je suis en train d'analyser un grand fichier texte en utilisant PHP et certaines lignes ressemblent à ceci "äåòñêèå ïåñíè", ou "ääò", ou comme ceci "åãîð ëåòîâ". Est-il possible de vérifier s'il y a plus de trois caractères comme ceci dans la chaîne?Comment faire pour supprimer les caractères indésirables d'une chaîne?

Merci.

+1

Langage de programmation? –

+0

@Kim, Regex, bien sûr! =] – strager

+0

@Kim, je suis l'analyse de ce fichier avec PHP – Psyche

Répondre

1

J'éviterais une regex. Parcourez simplement la chaîne, observez chaque caractère et tenez compte du nombre de caractères correspondant à vos critères.

+0

Mais comment cela aide-t-il à les supprimer? – pavium

+1

Pourquoi éviter l'expression rationnelle? RegExp est construit pour "passer d'une chaîne à l'autre, en regardant chaque caractère" – gnarf

+0

Mettez ces caractères qui sont ok dans une nouvelle chaîne? – Will

0

Vérifiez avec:/[^ \ d \ s \ w] {3}/

0
/X.*?X.*?X/ 

Remplacer X avec tout ce que les caractères que vous voulez ou ne voulez pas (par exemple [\x80-\xFF]).

0

Il semble que vous n'utilisiez pas le bon character encoding. Un fichier sur le disque est juste un tableau d'octets et un codage de caractères est l'idée qu'un octet avec la valeur 77 est majuscule M. La plupart des encodages de caractères ont les numéros 0-127 correspondant aux mêmes caractères, mais après cela, ils sont tous différent. De nombreux encodages de caractères plus récents utilisent plus d'un octet par caractère et utilisent souvent la notion de code point plutôt que de caractère.

Vous devriez devenir vraiment à l'aise avec character encodings, en particulier unicode, si vous ne voulez pas déformer, et ruiner les données de caractères.

+0

Voilà à quoi cela ressemble avec l'encodage ISO8859-15 Western. Avec UTF8, il ressemble à ceci: – Psyche

+0

Vous devez déjà connaître l'encodage des caractères. Si c'est juste une chose une fois, vous pourriez essayer de deviner plus d'entre eux. ISO-8859-1 est un autre codage commun. –

+0

Ou Windows-1252 qui est apparemment différent de ISO-8859-1. –

6

Vous pouvez essayer:

if (preg_match("/(?:.*?[\x80-\xFF]){3,}/", $string)) { 
    // report excess high-bit ascii 
} 

(?:   ; create a non-capture group 
    .*?   ; match any number of characters, without being greedy. 
    [\x80-\xFF] ; match a single high-bit character 
)    ; end the group 
{3,}   ; match the group 3 or more times 

Votre titre de la question élude à la suppression:

$out = preg_replace('/[\x80-\xFF]/', '', $input); 
+0

Merci gnarf, il semble bien fonctionner. – Psyche

0

Vous pouvez faire:

$string = preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_COMPAT, 'UTF-8')); 

Cela remplacera tous les caractères UTF-8 avec leur équivalent ASCII.

3

J'utilise le ci-dessous ... espérons que ces aide ...

function just_clean($string) 
{ 
// Replace other special chars 
$specialCharacters = array( 
'#' => '', 
'’' => '', 
'`' => '', 
'\'' => '', 
'$' => '', 
'%' => '', 
'&' => '', 
'@' => '', 
'.' => '', 
'€' => '', 
'+' => '', 
'=' => '', 
'§' => '', 
'\\' => '', 
'/' => '', 
'`' => '', 
'•' => '' 
); 

while (list($character, $replacement) = each($specialCharacters)) { 
$string = str_replace($character, '', $string); 
} 

$string = strtr($string, 
"ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ", 
"AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn" 
); 

// Remove all remaining other unknown characters 
$string = preg_replace('/[^a-zA-Z0-9\-]/', ' ', $string); 
$string = preg_replace('/^[\-]+/', '', $string); 
$string = preg_replace('/[\-]+$/', '', $string); 
$string = preg_replace('/[\-]{2,}/', ' ', $string); 
$string = clean_url($string); 
return $string; 
} 

function clean_url($text) 
{ 
$text=strtolower($text); 
$code_entities_match = array('&quot;' ,'!' ,'@' ,'#' ,'$' ,'%' ,'^' ,'&' ,'*' ,'(' ,')' ,'+' ,'{' ,'}' ,'|' ,':' ,'"' ,'<' ,'>' ,'?' ,'[' ,']' ,';' ,"'" ,',' ,'.' ,'_' ,'/' ,'*' ,'+' ,'~' ,'`' ,'=' ,'---' ,'--','--','-','’','`','•'); 
$code_entities_replace = array(' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ',' ',' ',' ',' ',' ',' '); 
$text = str_replace($code_entities_match, $code_entities_replace, $text); 
$text = trim($text," "); 
$text=str_replace(" ","-",$text); 
$text = cleanUnderScores($text); 
return $text; 
} 

function cleanUnderScores($text) 
{ 
$tst = $text; 
$under = "--"; 
$pos = 0; 

    while(strpos($tst, $under) != false) 
    { 
    //$pos = strpos($tst, $under); 
    $tst = str_replace("--", "-", $tst);  
    } 
return $tst; 
} 
Questions connexes