Bir dizeden istenmeyen karakterleri kaldırmak için nasıl?

7 Cevap php

Ben PHP kullanarak büyük bir metin dosyası ayrıştırma ediyorum ve bazı hatlar bu "äåòñêèå ïåñíè", ya da "aaO", ya da bu "AAID ëåòîâ" gibi gibi görünüyor. Böyle fazla üç karakter dize olup olmadığını kontrol etmek için herhangi bir yolu var mı?

Teşekkür ederim.

7 Cevap

Eğer deneyebilirsiniz:

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

Sizin soru başlık çıkarmadan eludes:

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

Ben bu yardım umarım ... altında kullanın ...

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;
}

Ben bir regex önlemek istiyorum.

Basitçe, dize adım adım her karakter bakıyor ve kaç karakter kriterlere uygun sayısını tutmak.

/ [^ \ D \ s \ w] {3,} /: ile kontrol edin

/X.*?X.*?X/

Istediğiniz ya da istemediğiniz ne karakterler X yerine (örneğin, [\x80-\xFF]).

Bu doğru kullanıyor olabilir gibi geliyor character encoding. Diskte bir dosya bayt sadece dizi ve karakter kodlama değeri 77 olan bir bayt büyük M. Çoğu karakter kodlamaları numaraları aynı karakterlere 0-127 eşleme, ancak bundan sonra, hepsi konum olduğu fikir farklı olabilir. Birçok yeni karakter kodlamaları karakter başına birden fazla bayt kullanmak, ve çoğu zaman oldukça karakteri daha code point kavramını kullanırlar.

Sen cendereye etmek istemiyorsanız, özellikle unicode, character encodings ile gerçekten rahat olmak ve harabe karakter veri gerekir.

Sen yapabilirsin:

$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'));

Bu onların ASCII eşdeğeri ile tüm UTF-8 karakterleri yerini alacak.