স্ট্রিং থেকে নন- utf8 অক্ষর অপসারণ করতে আমার সমস্যা হচ্ছে, যা সঠিকভাবে প্রদর্শিত হচ্ছে না। অক্ষরগুলি 0x97 0x61 0x6C 0x6F (হেক্স প্রতিনিধিত্ব) এর মতো
এগুলি সরানোর সর্বোত্তম উপায় কী? নিয়মিত অভিব্যক্তি নাকি অন্য কিছু?
স্ট্রিং থেকে নন- utf8 অক্ষর অপসারণ করতে আমার সমস্যা হচ্ছে, যা সঠিকভাবে প্রদর্শিত হচ্ছে না। অক্ষরগুলি 0x97 0x61 0x6C 0x6F (হেক্স প্রতিনিধিত্ব) এর মতো
এগুলি সরানোর সর্বোত্তম উপায় কী? নিয়মিত অভিব্যক্তি নাকি অন্য কিছু?
উত্তর:
একটি রেজেক্স পদ্ধতির ব্যবহার:
$regex = <<<'END'
/
(
(?: [\x00-\x7F] # single-byte sequences 0xxxxxxx
| [\xC0-\xDF][\x80-\xBF] # double-byte sequences 110xxxxx 10xxxxxx
| [\xE0-\xEF][\x80-\xBF]{2} # triple-byte sequences 1110xxxx 10xxxxxx * 2
| [\xF0-\xF7][\x80-\xBF]{3} # quadruple-byte sequence 11110xxx 10xxxxxx * 3
){1,100} # ...one or more times
)
| . # anything else
/x
END;
preg_replace($regex, '$1', $text);
এটি ইউটিএফ -8 সিকোয়েন্সগুলির সন্ধান করে এবং এগুলিকে 1 টি গ্রুপে বন্দী করে It প্রতিস্থাপন হ'ল যা 1 গ্রুপে ধরা পড়েছিল এটি কার্যকরভাবে সমস্ত অবৈধ বাইটগুলি সরিয়ে দেয়।
অবৈধ বাইটগুলি ইউটিএফ -8 অক্ষর হিসাবে এনকোড করে স্ট্রিংটি মেরামত করা সম্ভব। তবে ত্রুটিগুলি এলোমেলো হলে এটি কিছু অদ্ভুত প্রতীক ছেড়ে দিতে পারে।
$regex = <<<'END'
/
(
(?: [\x00-\x7F] # single-byte sequences 0xxxxxxx
| [\xC0-\xDF][\x80-\xBF] # double-byte sequences 110xxxxx 10xxxxxx
| [\xE0-\xEF][\x80-\xBF]{2} # triple-byte sequences 1110xxxx 10xxxxxx * 2
| [\xF0-\xF7][\x80-\xBF]{3} # quadruple-byte sequence 11110xxx 10xxxxxx * 3
){1,100} # ...one or more times
)
| ( [\x80-\xBF] ) # invalid byte in range 10000000 - 10111111
| ( [\xC0-\xFF] ) # invalid byte in range 11000000 - 11111111
/x
END;
function utf8replacer($captures) {
if ($captures[1] != "") {
// Valid byte sequence. Return unmodified.
return $captures[1];
}
elseif ($captures[2] != "") {
// Invalid byte of the form 10xxxxxx.
// Encode as 11000010 10xxxxxx.
return "\xC2".$captures[2];
}
else {
// Invalid byte of the form 11xxxxxx.
// Encode as 11000011 10xxxxxx.
return "\xC3".chr(ord($captures[3])-64);
}
}
preg_replace_callback($regex, "utf8replacer", $text);
সম্পাদনা করুন:
!empty(x)খালি শূন্য মানের সাথে মিলবে ( "0"খালি বিবেচিত)।x != ""সহ খালি শূন্য মানের সাথে মিলবে "0"।x !== ""বাদে কিছু মিলবে ""।x != "" এই ক্ষেত্রে ব্যবহার করা সবচেয়ে ভাল বলে মনে হচ্ছে।
আমিও ম্যাচটি একটু বাড়িয়ে দিয়েছি। প্রতিটি অক্ষর পৃথকভাবে মিলে না গিয়ে এটি বৈধ ইউটিএফ -8 অক্ষরের ক্রমগুলির সাথে মেলে।
$regex = <<<'END'পিএইচপি <5.3.x এর পরিবর্তে কী ব্যবহার করবেন?
elseif (!empty($captures([2])) {এবং !== ""খালি "0"বিবেচনা করার কারণে আপনার খালি পরিবর্তে ব্যবহার করা উচিত । এছাড়াও এই ফাংশনটি খুব ধীর, এটি কি আরও দ্রুত করা যায়?
আপনি যদি utf8_encode()ইতিমধ্যে একটি ইউটিএফ 8 স্ট্রিংয়ের জন্য প্রয়োগ করেন তবে এটি গার্লড ইউটিএফ 8 আউটপুট ফেরত দেবে।
আমি একটি ফাংশন তৈরি করেছি যা এই সমস্ত সমস্যার সমাধান করে। এটি বলা হয় Encoding::toUTF8()।
আপনার স্ট্রিংগুলির এনকোডিং কী তা আপনার জানতে হবে না। এটি ল্যাটিন 1 (আইএসও 8859-1), উইন্ডোজ -1222 বা ইউটিএফ 8 হতে পারে, বা স্ট্রিংটিতে এগুলির একটি মিশ্রণ থাকতে পারে। Encoding::toUTF8()সবকিছুকে ইউটিএফ 8 এ রূপান্তর করবে।
আমি এটি করেছি কারণ একটি পরিষেবা আমাকে সমস্ত গণ্ডগোলিত ডেটার ফিড দিচ্ছিল, সেই স্ট্রিংগুলিতে সেই এনকোডিংগুলি মিশিয়ে।
ব্যবহার:
require_once('Encoding.php');
use \ForceUTF8\Encoding; // It's namespaced now.
$utf8_string = Encoding::toUTF8($mixed_string);
$latin1_string = Encoding::toLatin1($mixed_string);
আমি অন্য একটি ক্রিয়াকলাপ, এনকোডিং :: ফিক্সটএফ 8 () অন্তর্ভুক্ত করেছি, যা প্রতিটি ইউটিএফ 8 স্ট্রিং স্থির করবে যা একাধিকবার ইউটিএফ 8 এ এনকোড করা হয়েছে বলে মনে হয় এমন পণ্যগুলি দেখায়।
ব্যবহার:
require_once('Encoding.php');
use \ForceUTF8\Encoding; // It's namespaced now.
$utf8_string = Encoding::fixUTF8($garbled_utf8_string);
উদাহরণ:
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
আউটপুট হবে:
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
ডাউনলোড করুন:
আপনি এমবিস্ট্রিং ব্যবহার করতে পারেন:
$text = mb_convert_encoding($text, 'UTF-8', 'UTF-8');
... অবৈধ অক্ষর মুছে ফেলবে।
<0x1a>
<0x1a>না হয় তবে মুদ্রণযোগ্য চরিত্র না হলেও এটি পুরোপুরি বৈধ ইউটিএফ -8 সিকোয়েন্স। প্রিন্টযোগ্য অক্ষরগুলি নিয়ে আপনার সমস্যা থাকতে পারে? এটি দেখুন: স্ট্যাকওভারফ্লো.com
ini_set('mbstring.substitute_character', 'none');অন্যথায় আমি ফলাফলের প্রশ্ন চিহ্ন পাচ্ছিলাম।
এই ফাংশনটি সমস্ত NON ASCII অক্ষর সরিয়ে দেয়, এটি দরকারী তবে প্রশ্নটি সমাধান করছে না:
এটি আমার কাজ যা সর্বদা কাজ করে, নির্বিশেষে এনকোডিং:
function remove_bs($Str) {
$StrArr = str_split($Str); $NewStr = '';
foreach ($StrArr as $Char) {
$CharNo = ord($Char);
if ($CharNo == 163) { $NewStr .= $Char; continue; } // keep £
if ($CharNo > 31 && $CharNo < 127) {
$NewStr .= $Char;
}
}
return $NewStr;
}
কিভাবে এটা কাজ করে:
echo remove_bs('Hello õhowå åare youÆ?'); // Hello how are you?
íঠিকানা ক্ষেত্রের চরিত্র ছিল যা একটি বৈধ UTF-8 অক্ষর দেখুন সারণী । মনোবল: এপিআই ত্রুটি বার্তাগুলিতে বিশ্বাস করবেন না :)
$text = iconv("UTF-8", "UTF-8//IGNORE", $text);
এই আমি ব্যবহার করছি। চমত্কার কাজ মনে হয়। Http://planetozh.com/blog/2005/01/remove-in अवैध- characters- in- utf-8/ থেকে নেওয়া হয়েছে
এটা চেষ্টা কর:
$string = iconv("UTF-8","UTF-8//IGNORE",$string);
আইকনভ ম্যানুয়াল অনুসারে , ফাংশনটি প্রথম প্যারামিটারটিকে ইনপুট চরসেট হিসাবে, দ্বিতীয় প্যারামিটারটিকে আউটপুট চরসেট হিসাবে এবং তৃতীয়টি প্রকৃত ইনপুট স্ট্রিং হিসাবে গ্রহণ করবে।
আপনি উভয় ইনপুট এবং আউটপুট অক্ষরসেট সেট করেন তাহলে হল UTF-8 , এবং সংযুক্ত //IGNOREআউটপুট অক্ষরসেট পতাকা, ফাংশন (ফালা) ইনপুট স্ট্রিং সব কিছু অক্ষর আছে যা আউটপুট অক্ষরসেট দ্বারা প্রতিনিধিত্ব করা যাবে না পতিত হবে। সুতরাং, কার্যকর ইনপুট স্ট্রিং ফিল্টারিং।
//IGNOREঅবৈধ ইউটিএফ -8 উপস্থিত নোটিশটি দমন করছে বলে মনে হচ্ছে না (যা অবশ্যই, আমি জানি এবং এটি ঠিক করতে চাই)। ম্যানুয়ালটিতে একটি উচ্চ রেট দেওয়া মন্তব্য মনে হচ্ছে এটি কয়েক বছর ধরে একটি বাগ হয়েছে।
iconv। @ হাইফার সম্ভবত আপনার ইনপুট ডেটা utf-8 থেকে নয়। আরেকটি বিকল্প হ'ল আসকিটিতে পুনরায় রূপান্তর করা এবং তারপরে আবার ইউটিএফ -8 এ ফিরে আসা। আমার ক্ষেত্রে আমি ব্যবহার হয়নি iconvমত$output = iconv("UTF-8//", "ISO-8859-1//IGNORE", $input );
পাঠ্যে নন- utf8 অক্ষর থাকতে পারে । প্রথমে করার চেষ্টা করুন:
$nonutf8 = mb_convert_encoding($nonutf8 , 'UTF-8', 'UTF-8');
আপনি এটি সম্পর্কে এখানে আরও পড়তে পারেন: http://php.net/manual/en/function.mb-convert-encoding.php সংবাদ
ইউকনভার্টার পিএইচপি 5.5 থেকে ব্যবহার করা যেতে পারে। আপনি যদি ইন্টেল এক্সটেনশন ব্যবহার করেন এবং এমবিস্ট্রিং না ব্যবহার করেন তবে ইউকনভার্টারটি আরও ভাল পছন্দ।
function replace_invalid_byte_sequence($str)
{
return UConverter::transcode($str, 'UTF-8', 'UTF-8');
}
function replace_invalid_byte_sequence2($str)
{
return (new UConverter('UTF-8', 'UTF-8'))->convert($str);
}
এইচটিএমএল স্পেশালচার্স পিএইচপি 5.4 থেকে অবৈধ বাইট ক্রম অপসারণ করতে ব্যবহার করা যেতে পারে। বৃহত আকারের বাইট এবং যথার্থতা পরিচালনা করার জন্য এইচটিএমএল স্পেশালচার্স প্রিগ_ম্যাচের চেয়ে ভাল is নিয়মিত এক্সপ্রেশন ব্যবহার করে অনেকগুলি ভুল বাস্তবায়ন দেখা যায়।
function replace_invalid_byte_sequence3($str)
{
return htmlspecialchars_decode(htmlspecialchars($str, ENT_SUBSTITUTE, 'UTF-8'));
}
আমি একটি ফাংশন তৈরি করেছি যা কোনও স্ট্রিং থেকে অবৈধ UTF-8 অক্ষর মুছে দেয়। এক্সএমএল এক্সপোর্ট ফাইল উত্পন্ন করার আগে আমি 27000 পণ্যগুলির বিবরণ সাফ করতে এটি ব্যবহার করছি।
public function stripInvalidXml($value) {
$ret = "";
$current;
if (empty($value)) {
return $ret;
}
$length = strlen($value);
for ($i=0; $i < $length; $i++) {
$current = ord($value{$i});
if (($current == 0x9) || ($current == 0xA) || ($current == 0xD) || (($current >= 0x20) && ($current <= 0xD7FF)) || (($current >= 0xE000) && ($current <= 0xFFFD)) || (($current >= 0x10000) && ($current <= 0x10FFFF))) {
$ret .= chr($current);
}
else {
$ret .= "";
}
}
return $ret;
}
ord()0-255 সীমাতে ফলাফল দেয়। ifএই ফাংশনটির দৈত্যটি ইউনিকোড ব্যাপ্তির জন্য পরীক্ষা করে যা ord()কখনই ফিরে আসবে না। এই ফাংশনটি কেন এমনভাবে কাজ করে তা যদি কেউ ব্যাখ্যা করতে চান তবে আমি অন্তর্দৃষ্টিটির প্রশংসা করব।
2019 এ স্বাগতম /uএবং রেজেজেমে সংশোধক যা আপনার জন্য ইউটিএফ -8 মাল্টিবাইট চরগুলি পরিচালনা করবে
আপনি যদি কেবলমাত্র ব্যবহার করেন তবেই mb_convert_encoding($value, 'UTF-8', 'UTF-8')আপনার স্ট্রিং-এ প্রিন্টযোগ্য অক্ষরগুলি শেষ হবে
এই পদ্ধতিটি করবে:
mb_convert_encoding\r, \x00(NULL-বাইট) এবং অন্যান্য নিয়ন্ত্রণ অক্ষর মুছুনpreg_replacefunction utf8_filter(string $value): string{
return preg_replace('/[^[:print:]\n]/u', '', mb_convert_encoding($value, 'UTF-8', 'UTF-8'));
}
[:print:]সমস্ত মুদ্রণযোগ্য অক্ষর এবং \nনিউলাইনগুলিকে মেলে এবং অন্য কিছু ছড়িয়ে দিন
আপনি নীচে ASCII টেবিলটি দেখতে পাচ্ছেন .. মুদ্রণযোগ্য চরগুলি 32 থেকে 127 অবধি \nরয়েছে , তবে নিউলাইনটি নিয়ন্ত্রণ বর্ণগুলির একটি অংশ যা 0 থেকে 31 এর মধ্যে রয়েছে তাই আমাদের রেজিজে নতুন লাইনের যোগ করতে হবে/[^[:print:]\n]/u
আপনি \x7F(ডেল), \x1B(ইস্ক) ইত্যাদির মুদ্রণযোগ্য ব্যাপ্তির বাইরে চরগুলি দিয়ে রেজেক্সের মাধ্যমে স্ট্রিংগুলি প্রেরণের চেষ্টা করতে পারেন এবং দেখুন যে তারা কীভাবে ছাঁটা হয়েছে
function utf8_filter(string $value): string{
return preg_replace('/[^[:print:]\n]/u', '', mb_convert_encoding($value, 'UTF-8', 'UTF-8'));
}
$arr = [
'Danish chars' => 'Hello from Denmark with æøå',
'Non-printable chars' => "\x7FHello with invalid chars\r \x00"
];
foreach($arr as $k => $v){
echo "$k:\n---------\n";
$len = strlen($v);
echo "$v\n(".$len.")\n";
$strip = utf8_decode(utf8_filter(utf8_encode($v)));
$strip_len = strlen($strip);
echo $strip."\n(".$strip_len.")\n\n";
echo "Chars removed: ".($len - $strip_len)."\n\n\n";
}
php-mbstringপিএইচপি তে ডিফল্টরূপে প্যাক হয় না।
$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'));
সাম্প্রতিক প্যাচ থেকে দ্রুপালের ফিডস জেএসএন পার্সার মডিউল:
//remove everything except valid letters (from any language)
$raw = preg_replace('/(?:\\\\u[\pL\p{Zs}])+/', '', $raw);
যদি আপনি হ্যাঁ উদ্বিগ্ন হন তবে এটি ফাঁকা স্থানগুলিকে বৈধ অক্ষর হিসাবে ধরে রাখে।
আমার যা প্রয়োজন ছিল তা করলাম। এটি আজকাল বিস্তৃত ইমোজি-অক্ষরগুলি সরিয়ে দেয় যা মাইএসকিউএল এর 'ইউটিএফ 8' অক্ষর সেটটিতে ফিট করে না এবং এটি আমাকে "এসকিউএলসেট [এইচওয়াই 1000] এর মতো ত্রুটি দিয়েছে: সাধারণ ত্রুটি: 1366 ভুল স্ট্রিংয়ের মান"।
বিস্তারিত জানার জন্য https://www.drupal.org/node/1824506#comment-6881382 দেখুন
iconvএ পর্যন্ত পুরানো ঢঙের regexp ভিত্তিক বেশী ভালো preg_replace, কোনটা আজকাল অসমর্থিত হয়েছে।
ereg_replace(), দুঃখিত।
সম্ভবত সবচেয়ে সুনির্দিষ্ট সমাধান না হলেও এটি কোডের একক লাইন দিয়ে কাজটি সম্পন্ন করে:
echo str_replace("?","",(utf8_decode($str)));
utf8_decodeঅক্ষরগুলি একটি প্রশ্ন চিহ্নে রূপান্তরিত করবে;
str_replaceপ্রশ্ন চিহ্নগুলি ছাঁটাই করবে।
সুতরাং নিয়মগুলি হ'ল প্রথম ইউটিএফ -8 অক্টলেটটিতে একটি মার্কার হিসাবে উচ্চ বিট সেট থাকে এবং তারপরে আরও কতগুলি অক্টলেট নির্দেশ করে 1 থেকে 4 বিট করে; তারপরে অতিরিক্ত অটলেটগুলির প্রত্যেকের উচ্চতর দুটি বিট 10 এ সেট করা থাকতে হবে।
সিউডো-পাইথন হ'ল:
newstring = ''
cont = 0
for each ch in string:
if cont:
if (ch >> 6) != 2: # high 2 bits are 10
# do whatever, e.g. skip it, or skip whole point, or?
else:
# acceptable continuation of multi-octlet char
newstring += ch
cont -= 1
else:
if (ch >> 7): # high bit set?
c = (ch << 1) # strip the high bit marker
while (c & 1): # while the high bit indicates another octlet
c <<= 1
cont += 1
if cont > 4:
# more than 4 octels not allowed; cope with error
if !cont:
# illegal, do something sensible
newstring += ch # or whatever
if cont:
# last utf-8 was not terminated, cope
এই একই যুক্তি পিএইচপি করার জন্য অনুবাদযোগ্য হওয়া উচিত। তবে, আপনি কোনও ত্রুটিযুক্ত চরিত্রটি পেয়ে গেলে কী ধরণের স্ট্রিপিং করা উচিত তা পরিষ্কার নয়।
c = (ch << 1)(c & 1)লুপটি এড়িয়ে প্রথমবারের মতো শূন্য করবে । পরীক্ষাটি সম্ভবত হওয়া উচিত(c & 128)
ইউনিকোড বেসিক ভাষা বিমানের বাইরে সমস্ত ইউনিকোড অক্ষর মুছে ফেলার জন্য:
$str = preg_replace("/[^\\x00-\\xFFFF]/", "", $str);
প্রশ্নের তুলনায় কিছুটা আলাদা, তবে আমি যা করছি তা হল এইচটিএমএল এনকোড (স্ট্রিং) ব্যবহার করা,
সিউডো কোড এখানে
var encoded = HtmlEncode(string);
encoded = Regex.Replace(encoded, "&#\d+?;", "");
var result = HtmlDecode(encoded);
ইনপুট এবং আউটপুট
"Headlight\x007E Bracket, { Cafe Racer<> Style, Stainless Steel 中文呢?"
"Headlight~ Bracket, { Cafe Racer<> Style, Stainless Steel 中文呢?"
আমি জানি এটি নিখুঁত নয়, তবে আমার জন্য কাজটি করে।
static $preg = <<<'END'
%(
[\x09\x0A\x0D\x20-\x7E]
| [\xC2-\xDF][\x80-\xBF]
| \xE0[\xA0-\xBF][\x80-\xBF]
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}
| \xED[\x80-\x9F][\x80-\xBF]
| \xF0[\x90-\xBF][\x80-\xBF]{2}
| [\xF1-\xF3][\x80-\xBF]{3}
| \xF4[\x80-\x8F][\x80-\xBF]{2}
)%xs
END;
if (preg_match_all($preg, $string, $match)) {
$string = implode('', $match[0]);
} else {
$string = '';
}
এটি আমাদের পরিষেবাতে কাজ করে
আইকনভি সম্পর্কে কীভাবে:
http://php.net/manual/en/function.iconv.php
এটি পিএইচপি নিজেই ব্যবহার করে নি তবে এটি সর্বদা আমার পক্ষে কমান্ড লাইনে ভাল সম্পাদন করেছে। আপনি এটি অবৈধ অক্ষরগুলির বিকল্প হিসাবে পেতে পারেন।