পিএইচপি: স্ট্রিং-এ সমস্ত মুদ্রণযোগ্য অক্ষর কীভাবে সরিয়ে ফেলবেন?


159

আমার ধারণা আমি 0-31 এবং 127 অক্ষর অপসারণ করতে হবে,

এটি দক্ষতার সাথে করার জন্য কোনও ফাংশন বা কোডের টুকরা রয়েছে?

উত্তর:


354

7 বিট এএসসিআইআই?

যদি আপনার তার্ডিস সবেমাত্র 1963 এ অবতরণ করেছে এবং আপনি কেবল 7 বিট প্রিন্টেবল এএসসিআইআই অক্ষর চান তবে আপনি এটির মাধ্যমে 0-31 এবং 127-255 থেকে সমস্ত কিছু ছাঁটাই করতে পারেন:

$string = preg_replace('/[\x00-\x1F\x7F-\xFF]/', '', $string);

এটি 0-31, 127-255 রেঞ্জের যে কোনও কিছুর সাথে মেলে এবং এটি সরিয়ে দেয়।

8 বিট বাড়ানো এএসসিআইআই?

আপনি একটি হট টব টাইম মেশিনে পড়েছিলেন এবং আপনি আশির দশকে ফিরে এসেছেন। যদি আপনি 8 বিট ASCII এর কিছু ফর্ম পেয়ে থাকেন তবে আপনি চরগুলি 128-255 এর মধ্যে রাখতে পারেন। একটি সহজ সমন্বয় - কেবল 0-31 এবং 127 এর জন্য দেখুন

$string = preg_replace('/[\x00-\x1F\x7F]/', '', $string);

হল UTF-8?

আহ, একবিংশ শতাব্দীতে ফিরে আসার জন্য আপনাকে স্বাগতম। আপনার যদি কোনও ইউটিএফ -8 এনকোডযুক্ত স্ট্রিং থাকে, তবে /u পরিবর্তকটি রেগেক্সে ব্যবহার করা যেতে পারে

$string = preg_replace('/[\x00-\x1F\x7F]/u', '', $string);

এটি কেবল 0-31 এবং 127 কে সরিয়ে দেয় This এটি ASCII এবং UTF-8 এ কাজ করে কারণ উভয়ই একই নিয়ন্ত্রণ সেট পরিসীমা ভাগ করে দেয় (নীচে মিলাগুট দ্বারা উল্লিখিত)। কঠোরভাবে বলতে গেলে, এটি /uসংশোধক ছাড়াই কাজ করবে । তবে আপনি অন্যান্য চরিত্রগুলি সরাতে চাইলে এটি জীবনকে আরও সহজ করে তোলে ...

আপনি যদি ইউনিকোডের সাথে কাজ করছেন তবে সম্ভাব্য অনেকগুলি মুদ্রনবিহীন উপাদান রয়েছে তবে আসুন একটি সাধারণ বিষয় বিবেচনা করুন: কোন- BREAK স্পেস (ইউ + 00A0)

কোনও ইউটিএফ -8 স্ট্রিংয়ে এটি এনকোড হবে 0xC2A0। আপনি সেই নির্দিষ্ট ক্রমটি সন্ধান করতে এবং মুছে ফেলতে পারেন, তবে পরিবর্তে /uস্থান পরিবর্তন করে আপনি কেবল \xA0অক্ষর শ্রেণিতে যোগ করতে পারেন :

$string = preg_replace('/[\x00-\x1F\x7F\xA0]/u', '', $string);

সংযোজন: আরআর_প্লেস সম্পর্কে কী?

প্রিগ_প্লেসটি বেশ দক্ষ, তবে আপনি যদি এই অপারেশনটি প্রচুর পরিমাণে করেন তবে আপনি মুছে ফেলতে চান এমন একটি অ্যারে তৈরি করতে পারেন, এবং নীচে ম্যাগজুট দ্বারা উল্লিখিত হিসাবে str_replace ব্যবহার করতে পারেন, যেমন

//build an array we can re-use across several operations
$badchar=array(
    // control characters
    chr(0), chr(1), chr(2), chr(3), chr(4), chr(5), chr(6), chr(7), chr(8), chr(9), chr(10),
    chr(11), chr(12), chr(13), chr(14), chr(15), chr(16), chr(17), chr(18), chr(19), chr(20),
    chr(21), chr(22), chr(23), chr(24), chr(25), chr(26), chr(27), chr(28), chr(29), chr(30),
    chr(31),
    // non-printing characters
    chr(127)
);

//replace the unwanted chars
$str2 = str_replace($badchar, '', $str);

স্বজ্ঞাতভাবে, এটি মনে হয় এটি দ্রুত হবে, তবে এটি সর্বদা হয় না, এটি আপনাকে কোনও কিছু সাশ্রয় করে কিনা তা নিশ্চিতভাবে আপনার অবশ্যই বেঞ্চমার্ক করা উচিত। আমি এলোমেলো ডেটা সহ বিভিন্ন স্ট্রিং দৈর্ঘ্য জুড়ে কিছু বেঞ্চমার্ক করেছি এবং এই প্যাটার্নটি php 7.0.12 ব্যবহার করে উদ্ভূত হয়েছে

     2 chars str_replace     5.3439ms preg_replace     2.9919ms preg_replace is 44.01% faster
     4 chars str_replace     6.0701ms preg_replace     1.4119ms preg_replace is 76.74% faster
     8 chars str_replace     5.8119ms preg_replace     2.0721ms preg_replace is 64.35% faster
    16 chars str_replace     6.0401ms preg_replace     2.1980ms preg_replace is 63.61% faster
    32 chars str_replace     6.0320ms preg_replace     2.6770ms preg_replace is 55.62% faster
    64 chars str_replace     7.4198ms preg_replace     4.4160ms preg_replace is 40.48% faster
   128 chars str_replace    12.7239ms preg_replace     7.5412ms preg_replace is 40.73% faster
   256 chars str_replace    19.8820ms preg_replace    17.1330ms preg_replace is 13.83% faster
   512 chars str_replace    34.3399ms preg_replace    34.0221ms preg_replace is  0.93% faster
  1024 chars str_replace    57.1141ms preg_replace    67.0300ms str_replace  is 14.79% faster
  2048 chars str_replace    94.7111ms preg_replace   123.3189ms str_replace  is 23.20% faster
  4096 chars str_replace   227.7029ms preg_replace   258.3771ms str_replace  is 11.87% faster
  8192 chars str_replace   506.3410ms preg_replace   555.6269ms str_replace  is  8.87% faster
 16384 chars str_replace  1116.8811ms preg_replace  1098.0589ms preg_replace is  1.69% faster
 32768 chars str_replace  2299.3128ms preg_replace  2222.8632ms preg_replace is  3.32% faster

সময়গুলি নিজেরাই 10000 পুনরাবৃত্তির জন্য, তবে এর চেয়ে বেশি আকর্ষণীয় বিষয় হ'ল আপেক্ষিক পার্থক্য। 512 টি পর্যন্ত চরিত্র পর্যন্ত, আমি সবসময়ই পূর্ববর্তী স্থানে জয় দেখছিলাম। 1-8 কিলোবাইটের সীমার মধ্যে, str_replace এর প্রান্তিক প্রান্ত ছিল।

আমি ভেবেছিলাম এটি আকর্ষণীয় ফলাফল, সুতরাং এটি এখানে অন্তর্ভুক্ত করুন। গুরুত্বপূর্ণ বিষয়টি এই ফলাফলটি গ্রহণ করা এবং কোন পদ্ধতিটি ব্যবহার করা উচিত তা সিদ্ধান্ত নিতে এটি ব্যবহার করা নয়, তবে আপনার নিজের ডেটার বিপরীতে চিহ্নিত করা এবং তারপরে সিদ্ধান্ত নেওয়া।


14
আপনি যদি একটি নতুন লাইন নিরাপদ বিবেচনা করতে চান, তবে এটিকে প্রকাশ করুন (বিপরীতে মুদ্রণযোগ্যগুলির জন্য অনুসন্ধান করুন): প্রিগ_রেপ্লেস (/ [^ \ x0A \ x20- \ x7E] /, '', $ স্ট্রিং);
নিক

12
@ ডালিন একটি "ইউটিএফ -8 চরিত্র" বলে কিছু নেই। এখানে ইউনিকোড প্রতীক / অক্ষর রয়েছে এবং ইউটিএফ -8 হ'ল একটি এনকোডিং যা তাদের সকলকে উপস্থাপন করতে পারে। আপনি বলতে চাইছেন এটি ASCII অক্ষর সেটের বাইরে অক্ষরের জন্য কাজ করে না।
ম্যাথিয়াস বাইনেস

3
যদি আপনার \ xFF এর উপরে কোনও ইউনিকোড চরিত্রের মিল প্রয়োজন হয়, তবে \ x {####}
পিটার ওলসন

আপনি \ x7F (127) যা মুদ্রণযোগ্য নয় এমন চরিত্র মিস
Mubashar

এটি আরবি অক্ষরগুলি সরিয়ে ফেলবে, খারাপ সমাধান।
আয়মান হুসেন

141

এখানে অন্যান্য উত্তরগুলির মধ্যে অনেকগুলি ইউনিকোড অক্ষরকে বিবেচনা করে না (যেমন öäüßйȝîûηы ე மி ᚉ ⠛)। এই ক্ষেত্রে আপনি নিম্নলিখিত ব্যবহার করতে পারেন:

$string = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]/u', '', $string);

পরিসরে অক্ষরের একটি অদ্ভুত শ্রেণির অক্ষর রয়েছে \x80-\x9F( অক্ষরের 7-বিট ASCII সীমার উপরে) যা প্রযুক্তিগতভাবে অক্ষরগুলি নিয়ন্ত্রণ করে, তবে সময়ের সাথে সাথে মুদ্রণযোগ্য অক্ষরগুলির জন্য অপব্যবহার করা হয়। এগুলি নিয়ে যদি আপনার কোনও সমস্যা না হয় তবে আপনি এটি ব্যবহার করতে পারেন:

$string = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/u', '', $string);

আপনি যদি লাইন ফিডস, ক্যারেজ রিটার্ন, ট্যাব, নন-ব্রেকিং স্পেস এবং নরম হাইফেনগুলিও সজ্জিত করতে চান তবে আপনি ব্যবহার করতে পারেন:

$string = preg_replace('/[\x00-\x1F\x7F-\xA0\xAD]/u', '', $string);

নোট করুন যে উপরের উদাহরণগুলির জন্য আপনাকে অবশ্যই একক উদ্ধৃতি ব্যবহার করতে হবে

আপনি যদি বেসিক মুদ্রণযোগ্য ASCII অক্ষরগুলি বাদ দিয়ে সমস্ত কিছু ছিনিয়ে নিতে চান তবে (উপরের সমস্ত উদাহরণের অক্ষরগুলি ছাঁটাই হয়ে যাবে) আপনি ব্যবহার করতে পারেন:

$string = preg_replace( '/[^[:print:]]/', '',$string);

রেফারেন্সের জন্য দেখুন http://www.fileformat.info/info/charset/UTF-8/list.htm


1
আপনার regexp UTF8 অক্ষর জরিমানা পরিচালনা করে; তবে এটি ইউটিএফ 8 বিহীন "বিশেষ" অক্ষরগুলি বাদ দেয়; যেমন ç, ü এবং like ö '/[\x00-\x1F\x80-\xC0]/u'তাদের অক্ষত রাখে; তবে বিভাগ (F7) এবং গুণন (ডি 7) সাইনও।
হাজার

@ বাজার হ্যাঁ আপনি সঠিক \ x80- \ xFF খুব বেশি ছিটকে গেছেন, কিন্তু \ x80- \ xC0 এখনও খুব সীমাবদ্ধ। এটি অন্যান্য মুদ্রণযোগ্য অক্ষর যেমন © £ ± মিস করবে ± রেফারেন্সের জন্য utf8-chartable.de দেখুন
ডালিন

1
@ টিমম্যালোন কারণ পিএইচপি এই চরিত্রের ক্রমগুলি প্রসারিত করবে: php.net/manual/en/… যাতে রেজেক্স আপনি যে পরিধিটি সম্পর্কে এটি বলার চেষ্টা করছেন তা দেখতে পাবেন না।
ডালিন

1
7F সম্পর্কে কি? এটা করা উচিত নয় \x7F-\x9F?
বেল

1
আমি কেবল অনেক চেষ্টা করেছি, পিএইচপি থেকে প্রতিটি এনকোডিং ফাংশন চেষ্টা করেছিলাম রেইজেক্স থেকে এমবি_এইচটিএমএল স্পেশালচার্স ইত্যাদি। কিছুই নিয়ন্ত্রণের অক্ষর অপসারণ করেনি, কাজটি বিনিয়োগের জন্য ধন্যবাদ।
জন

29

পিএইচপি ৫.২ দিয়ে শুরু করে, আমাদের ফিল্টার_ভারে অ্যাক্সেস রয়েছে, যা আমি এখান থেকে ফেলে দিয়েছি বলে ভাবার কোনও উল্লেখ দেখিনি। অ-মুদ্রণযোগ্য অক্ষরগুলি <32 এবং> 127 ফালা করতে ফিল্টার_ভার ব্যবহার করতে, আপনি এটি করতে পারেন:

32 এর নীচে ASCII অক্ষর ফিল্টার করুন

$string = filter_var($input, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW);

127 এর উপরে ASCII অক্ষরগুলি ফিল্টার করুন

$string = filter_var($input, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_HIGH);

উভয় স্ট্রিপ:

$string = filter_var($input, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW|FILTER_FLAG_STRIP_HIGH);

উচ্চ স্ট্রিপিংয়ের সময় আপনি নিম্ন বর্ণগুলি (নিউলাইন, ট্যাব ইত্যাদি) এইচটিএমএল-এনকোডও করতে পারেন:

$string = filter_var($input, FILTER_UNSAFE_RAW, FILTER_FLAG_ENCODE_LOW|FILTER_FLAG_STRIP_HIGH);

এইচটিএমএল স্ট্রিপিং, ই-মেইল এবং ইউআরএলগুলি স্যানিটাইজেশন ইত্যাদির বিকল্পও রয়েছে So সুতরাং, স্যানিটাইজেশনের প্রচুর বিকল্প (ডাটা স্ট্রিপ আউট) এবং এমনকি বৈধকরণ (নিঃশব্দে স্ট্রিপিংয়ের চেয়ে বৈধ না হলে মিথ্যা প্রত্যাবর্তন)।

স্যানিটাইজেশন: http://php.net/manual/en/filter.filters.sanitize.php

বৈধতা: http://php.net/manual/en/filter.filters. માન્ય ate.php

তবে, এখনও সমস্যাটি রয়েছে যে FILTER_FLAG_STRIP_LOW নতুন লাইন এবং ক্যারেজ রিটার্নগুলি সরিয়ে ফেলবে, যা একটি টেক্সারিয়ার জন্য সম্পূর্ণ বৈধ অক্ষর ... সুতরাং আমার ধারণা, কিছু রেজেক্স উত্তর এখনও সময়ে প্রয়োজনীয়, যেমন এটি পর্যালোচনা করার পরে থ্রেড, আমি টেক্সারিয়াসের জন্য এটি করার পরিকল্পনা করছি:

$string = preg_replace( '/[^[:print:]\r\n]/', '',$input);

এটি সংখ্যার পরিসীমা দ্বারা ছিটকে আসা অনেকগুলি রেজেক্সের চেয়ে বেশি পঠনযোগ্য বলে মনে হয়।



18

এটি সহজ:

$ স্ট্রিং = প্রেগ_রেপ্লেস ('/ [^ [: cntrl:]] /', '', $ স্ট্রিং);


5
এটি লাইন ফিডস, ক্যারেজ রিটার্ন এবং ইউটিএফ 8 অক্ষরগুলিও বাদ দেয়।
ডালিন

5
@ ডালিন একটি "ইউটিএফ -8 চরিত্র" বলে কিছু নেই। এখানে ইউনিকোড প্রতীক / অক্ষর রয়েছে এবং ইউটিএফ -8 হ'ল একটি এনকোডিং যা তাদের সকলকে উপস্থাপন করতে পারে। আপনি বোঝাতে চেয়েছিলেন ASCII ব্যাপ্তির বাইরেও এই স্ট্রিপ অক্ষরগুলি
ম্যাথিয়াস বাইনেস

1
আরবি অক্ষর খায় :)
রলফ

16

সমস্ত সমাধান আংশিকভাবে কাজ করে, এবং নীচে এমনকি সম্ভবত সমস্ত কেস কভার করে না। আমার সমস্যাটি একটি utf8 mysql টেবিলের মধ্যে একটি স্ট্রিং toোকানোর চেষ্টা করেছিল in স্ট্রিং (এবং এর বাইটস) সমস্ত ইউটিএফ 8 তে রূপান্তরিত হয়েছে তবে বেশ কয়েকটি খারাপ ক্রম রয়েছে। আমি ধরে নিই যে তাদের বেশিরভাগই নিয়ন্ত্রণ বা ফর্ম্যাটিং ছিল।

function clean_string($string) {
  $s = trim($string);
  $s = iconv("UTF-8", "UTF-8//IGNORE", $s); // drop all non utf-8 characters

  // this is some bad utf-8 byte sequence that makes mysql complain - control and formatting i think
  $s = preg_replace('/(?>[\x00-\x1F]|\xC2[\x80-\x9F]|\xE2[\x80-\x8F]{2}|\xE2\x80[\xA4-\xA8]|\xE2\x81[\x9F-\xAF])/', ' ', $s);

  $s = preg_replace('/\s+/', ' ', $s); // reduce all multiple whitespace to a single space

  return $s;
}

সমস্যাটিকে আরও বাড়িয়ে তোলার জন্য হ'ল টেবিল বনাম সার্ভার বনাম সংযোগ বনাম কনটেন্টের রেন্ডারিং, যেমন এখানে কিছুটা আলোচনা করা হয়েছে


1
আমার ইউনিট পরীক্ষায় উত্তীর্ণ একমাত্র, দুর্দান্ত!
Korri

\ xE2 \ x80 [\ xA4- \ xA8] (বা 226.128। [164-168]) - ভুল, ক্রমটি পরবর্তী মুদ্রণযোগ্য প্রতীকগুলি অন্তর্ভুক্ত করে: ইউনিকোড অক্ষর 'ওয়ান ডট লিডার' (ইউ + 2024), ইউনিকোড চরিত্র 'দুটি ডট শীর্ষস্থানীয় (U + 2025), ইউনিকোড অক্ষর 'HORIZONTAL ELLipsIS' (U + 2026), ইউনিকোড অক্ষর 'হাইফেনেশন পয়েন্ট' (U + 2027)। এবং কেবল একটি মুদ্রণযোগ্য: ইউনিকোড অক্ষর 'লাইন SEPARATOR' (ইউ + 2028)। পরেরটি হ'ল মুদ্রণযোগ্যও: ইউনিকোড অক্ষর 'PARGP SEPARATOR' (U + 2029)। সুতরাং সিকোয়েন্সটি এর সাথে প্রতিস্থাপন করুন: SE xE2 \ x80 [\ xA8- \ xA9] \ xE2 \ x80 [\ xA8- \ xA9] লাইন সেটেরেটর এবং প্যারিকেশন সিলেটর সরানোর জন্য।
মিঙ্গালেভএমই

এটি আমি এখনও অবধি খুঁজে পেলাম এমন সেরা সমাধান, তবে $s = preg_replace('/(\xF0\x9F[\x00-\xFF][\x00-\xFF])/', ' ', $s);ইমোজি চরিত্রগুলি মাইএসকিএল-এ জগাখিচু হচ্ছিল বলে আমি লাশ যুক্ত করতে পেরেছি
জো ব্ল্যাক

9

আমার ইউটিএফ -8 অনুবর্তী সংস্করণ:

preg_replace('/[^\p{L}\s]/u','',$value);


7
এটি ভালভাবে উদ্ধৃতি, বন্ধনী ইত্যাদির মতো অক্ষর মুছে ফেলবে Those
গাজুস

এটা চমৎকার! এটি আমার জীবন বাঁচিয়েছিল, আরবি চরিত্রগুলি মুদ্রণের সময় গণ্ডগোল করেছিল, চ্যাম্পের মতো কাজ করেছিল :)
কৃষ্ণ

6

আপনি যে অক্ষর রাখতে চান তা বাদ দিয়ে আপনি সমস্ত কিছু সরানোর জন্য একটি নিয়মিত এক্সপ্রেস ব্যবহার করতে পারেন:

$string=preg_replace('/[^A-Za-z0-9 _\-\+\&]/','',$string);

(^) অক্ষর এজেড বা এজেড, 0-9 সংখ্যা, স্থান, আন্ডারস্কোর, হাইপেন, প্লাস এবং অ্যাম্পারস্যান্ড - কিছুই না করে (অর্থাত এটি মুছে ফেলুন) প্রতিস্থাপন করে।


5
preg_replace('/(?!\n)[\p{Cc}]/', '', $response);

এটি নতুন নিয়ন্ত্রণের অক্ষরগুলি রেখে সমস্ত নিয়ন্ত্রণ অক্ষর ( http://uk.php.net/manual/en/regexp.references.unicode.php ) সরিয়ে ফেলবে \n। আমার অভিজ্ঞতা থেকে, নিয়ন্ত্রণের অক্ষরগুলি হ'ল যা প্রায়শই মুদ্রণের সমস্যার কারণ হয়ে থাকে।


1
এটা আমার জন্য নিখুঁত কাজ করে! আমি কেবল /uইউটিএফ -8 অক্ষরের জন্য যুক্ত করেছি । আপনি দয়া করে প্রথম অংশটি কি ব্যাখ্যা করতে (?!\n)পারেন?
মারসিও মাজ্জাচাতো

4

ইনপুট স্ট্রিং থেকে সমস্ত নন-এএসসিআইআই অক্ষর ফেলা To

$result = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $string);

এই কোডটি হেক্সের মধ্যে 0-31 এবং 128-255 রেঞ্জের যে কোনও অক্ষর সরিয়ে দেয়, ফলাফলের স্ট্রিংয়ে কেবলমাত্র হেক্স অক্ষর 32-127 রেখে যায়, যা আমি উদাহরণ হিসাবে বলি। ফলাফলটি।


3

@PaulDixon উত্তর হয় সম্পূর্ণ ভুল কারণ এটি মুদ্রণযোগ্য সরিয়ে ফেলা বর্ধিত ASCII অক্ষর 128-255! আংশিকভাবে সংশোধন করা হয়েছে। আমি জানি না কেন তিনি এখনও 128 অক্ষর 7-বিট ASCII সেট থেকে 128-255 মুছে ফেলতে চান কারণ এতে বর্ধিত ASCII অক্ষর নেই।

তবে শেষ পর্যন্ত এটি মুছে ফেলা গুরুত্বপূর্ণ নয় 128-255 কারণ উদাহরণস্বরূপ chr(128)( \x80) 8-বিট ASCII এ ইউরো সাইন এবং উইন্ডোজের অনেকগুলি ইউটিএফ -8 ফন্ট আমার নিজস্ব পরীক্ষা সংক্রান্ত একটি ইউরো চিহ্ন এবং অ্যান্ড্রয়েড প্রদর্শন করে

আপনি যদি কোনও ইউটিএফ -8 স্ট্রিং (সম্ভবত কোনও মাল্টি বাইট ইউটিএফ -8 অক্ষরের শুরুর বাইট) থেকে ASCII অক্ষর 128-255 মুছে ফেলেন তবে এটি অনেকগুলি ইউটিএফ -8 অক্ষরকে হত্যা করবে। সুতরাং যে না! বর্তমানে ব্যবহৃত সমস্ত ফাইল সিস্টেমে এগুলি সম্পূর্ণ আইনি অক্ষর are একমাত্র সংরক্ষিত পরিসীমা 0-31

পরিবর্তে মুদ্রণযোগ্য অক্ষর 0-31 এবং 127 মুছতে এটি ব্যবহার করুন:

$string = preg_replace('/[\x00-\x1F\x7F]/', '', $string);

এটি ASCII এবং UTF-8 এ কাজ করে কারণ উভয়ই একই নিয়ন্ত্রণ সেট পরিসীমা ভাগ করে ।

দ্রুততম রেগুলার এক্সপ্রেশনের ব্যবহার না করেই slower¹ বিকল্প:

$string = str_replace(array(
    // control characters
    chr(0), chr(1), chr(2), chr(3), chr(4), chr(5), chr(6), chr(7), chr(8), chr(9), chr(10),
    chr(11), chr(12), chr(13), chr(14), chr(15), chr(16), chr(17), chr(18), chr(19), chr(20),
    chr(21), chr(22), chr(23), chr(24), chr(25), chr(26), chr(27), chr(28), chr(29), chr(30),
    chr(31),
    // non-printing characters
    chr(127)
), '', $string);

আপনি সব হোয়াইটস্পেস অক্ষর রাখতে চান \t, \nএবং \rতারপর, অপসারণ chr(9), chr(10)এবং chr(13)এই তালিকা থেকে। দ্রষ্টব্য: স্বাভাবিক সাদা অংশ chr(32)তাই ফলাফলের মধ্যে থেকে যায়। আপনি ব্রেক-নন-স্থানটি মুছে ফেলতে চান কিনা তা নিজেই স্থির করুন chr(160)কারণ এটি সমস্যার কারণ হতে পারে।

@ @পলডিকসন দ্বারা পরীক্ষিত এবং নিজেই যাচাই করেছি।


2

কেমন:

return preg_replace("/[^a-zA-Z0-9`_.,;@#%~'\"\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:\-\s\\\\]+/", "", $data);

আমি কী অন্তর্ভুক্ত করতে চাই তার সম্পূর্ণ নিয়ন্ত্রণ দেয়


0

চিহ্নিত আনসারটি নিখুঁত তবে এটি 127 (ডেল) অক্ষরটি মিস করে যা একটি মুদ্রণযোগ্য অক্ষরও

আমার উত্তর হবে

$string = preg_replace('/[\x00-\x1F\x7f-\xFF]/', '', $string);

এই উত্তরটিও ভুল। দেখুন: stackoverflow.com/a/42058165/318765
mgutt

উপরের উত্তরটি মূল উত্তরের প্রশংসা ছিল যা কেবল "মুছুন" অক্ষর যুক্ত করে।
মুবাশার

0

"সিডিবাদ" সুইডিশ অক্ষরের অবিচ্ছিন্ন ফলাফলের সাথে আমার জন্য সমস্যাটি সমাধান করেছে ÅÄÖ ÅÄÖ

$text = preg_replace( '/[^\p{L}\s]/u', '', $text );

ধন্যবাদ!


0

যে কেউ এখনও মুদ্রণযোগ্য অক্ষরগুলি না সরিয়ে কীভাবে এটি করবেন তা দেখছেন, তবে তাদের থেকে পালাতে গিয়ে আমি এটি সাহায্য করার জন্য তৈরি করেছি। এটি উন্নত নির্দ্বিধায়! অক্ষরগুলি \\ x [A-F0-9] [A-F0-9] এ পালানো হয়েছে।

যেমন কল:

$escaped = EscapeNonASCII($string);

$unescaped = UnescapeNonASCII($string);

<?php 
  function EscapeNonASCII($string) //Convert string to hex, replace non-printable chars with escaped hex
    {
        $hexbytes = strtoupper(bin2hex($string));
        $i = 0;
        while ($i < strlen($hexbytes))
        {
            $hexpair = substr($hexbytes, $i, 2);
            $decimal = hexdec($hexpair);
            if ($decimal < 32 || $decimal > 126)
            {
                $top = substr($hexbytes, 0, $i);
                $escaped = EscapeHex($hexpair);
                $bottom = substr($hexbytes, $i + 2);
                $hexbytes = $top . $escaped . $bottom;
                $i += 8;
            }
            $i += 2;
        }
        $string = hex2bin($hexbytes);
        return $string;
    }
    function EscapeHex($string) //Helper function for EscapeNonASCII()
    {
        $x = "5C5C78"; //\x
        $topnibble = bin2hex($string[0]); //Convert top nibble to hex
        $bottomnibble = bin2hex($string[1]); //Convert bottom nibble to hex
        $escaped = $x . $topnibble . $bottomnibble; //Concatenate escape sequence "\x" with top and bottom nibble
        return $escaped;
    }

    function UnescapeNonASCII($string) //Convert string to hex, replace escaped hex with actual hex.
    {
        $stringtohex = bin2hex($string);
        $stringtohex = preg_replace_callback('/5c5c78([a-fA-F0-9]{4})/', function ($m) { 
            return hex2bin($m[1]);
        }, $stringtohex);
        return hex2bin(strtoupper($stringtohex));
    }
?>

0

আমি ইউটিএফ 8 এর জন্য https://github.com/neitanod/forutf8 ব্যবহার করে সমস্যার সমাধান করেছি

use ForceUTF8\Encoding;

$string = Encoding::fixUTF8($string);

1
এই লিবিটি ইউটিএফ -8 স্বরযুক্ত অক্ষর এবং ইউটিএফ -8 ইমোটিকনগুলিকে "রূপান্তর করে?" প্রতীক। দুর্ভাগ্যক্রমে মোটামুটি গুরুতর সমস্যা।
ক্রিস্টোকিউই

0

ইউনিকোড: 0x1 ডি (পিএইচপি 7.4 সহ) জন্য নির্বাচিত উত্তরে রেজেক্স ব্যর্থ হয়েছে

একটি সমাধান:

<?php
        $ct = 'différents'."\r\n test";

        // fail for Unicode: 0x1d
        $ct = preg_replace('/[\x00-\x1F\x7F]$/u', '',$ct);

        // work for Unicode: 0x1d
        $ct =  preg_replace( '/[^\P{C}]+/u', "",  $ct);

        // work for Unicode: 0x1d and allow line break
        $ct =  preg_replace( '/[^\P{C}\n]+/u', "",  $ct);

        echo $ct;

থেকে: ইউটিএফ 8 স্ট্রিং নিউলাইন ছাড়া সমস্ত অদৃশ্য অক্ষর মুছে ফেলে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.