অ-অক্ষরীয় অক্ষরগুলি কীভাবে সরাবেন?


349

আমাকে স্ট্রিং থেকে সমস্ত অক্ষর সরিয়ে ফেলতে হবে যা a-z A-Z 0-9সেট না থাকা বা ফাঁকা স্থান নয়।

কারও কি এটি করার জন্য কোনও ফাংশন আছে?

উত্তর:


695

আপনি ইতিমধ্যে কী করতে চেয়েছিলেন এমন আপনার মতামত প্রায় জেনে গেছে, আপনি মূলত এটিকে একটি রেজেক্স হিসাবে সংজ্ঞায়িত করেছেন।

preg_replace("/[^A-Za-z0-9 ]/", '', $string);

8
zuk1: রেজেক্সবাডি এটির জন্য একটি দুর্দান্ত সহায়তা

2
আপনি যদি হাইফেনকে অনুমোদিত চরিত্র হিসাবে অন্তর্ভুক্ত করতে চান তবে এখানে একটি উদাহরণ দেওয়া আছে। আমার এটি প্রয়োজন কারণ ইমেল ঠিকানার উপর ভিত্তি করে মুডল ইউজারনেম থেকে নিষিদ্ধ অক্ষরগুলি বের করে ফেলার দরকার ছিল: প্রিগ_রেপ্লেস ("/ [^ a-z0-9 _। @ \ -] /", '', $ স্ট্রিং);
ইভান

2
এটি কি উদ্ধৃতি চিহ্নের (ডাবল-কোট) পরিবর্তে নিয়মিত অভিব্যক্তির আশেপাশের অ্যাডাস্ট্রোফসের (একক-কোট) ঠিক একই কাজ করবে? যেমন:preg_replace('/[^A-Za-z0-9 ]/', '', $string);
2540625

3
আমরা এই সম্পর্কে ব্যাখ্যা চাই :)। লোকেরা এখানে আসার কারণ এটি কেন see রেজেক্স ব্যাখ্যাটিও বিবেচনা করুন! ধন্যবাদ
প্রতীক

1
যদি আমরা উচ্চারণযুক্ত চরিত্রগুলি রাখতে চাই?
winzbak

169

ইউনিকোড অক্ষরের জন্য, এটি হ'ল:

preg_replace("/[^[:alnum:][:space:]]/u", '', $string);

হাই ভন্ডো, / ui জিনিস দিয়ে কি আছে .. আপনি এটাকে কী বলছেন? কেউ দয়া করে আমাকে কিছুটা আলোকিত করতে পারেন? ধন্যবাদ.
কেবিয়াং

4
স্পষ্টতার জন্য, তাদের পতাকা বলা হয়। এগুলি সমাপ্তি ডিলিমিটারের পরে রাখা হয়েছে (এক্ষেত্রে এটি "/", তবে এটি "~" বা "@" হতে পারে বা আপনি যে অক্ষরটি উদ্বোধন এবং সমাপ্তি ডিলিমিটারগুলি একই হিসাবে ব্যবহার করতে চান) এবং পরিবর্তনটি পরিবর্তন করতে পারে অভিব্যক্তি আচরণ।
ডক্টর জে

1
বিটিডব্লিউ, \wঅন্তর্ভুক্ত \dএবং তাই \dঅপ্রয়োজনীয়। এছাড়াও, এটি ভুল কারণ এটি ফলাফলের স্ট্রিংয়ের (যা এতে অন্তর্ভুক্ত রয়েছে \w) আন্ডারস্কোরগুলি ছেড়ে দেয় ।
স্মিথ

2
এটিতে এখনও একটি ত্রুটি রয়েছে, অক্ষর ক্লাসগুলি ':]' দিয়ে শেষ করা দরকার তাই সঠিক লাইনটি হ'ল: পূর্ববর্তী স্থান ("/ [^ [: অ্যালাম:] [: স্থান:]] / ui", '', স্ট্রিং $);
h00ligan

4
ইতিমধ্যে উভয় কেসকেই কভার করা iথেকে পতাকাটি এখানে কি সত্যিই প্রয়োজনীয় [:alnum:]?
বিলেণোহ

50

নিয়মিত প্রকাশ আপনার উত্তর।

$str = preg_replace('/[^a-z\d ]/i', '', $str);
  • সংক্ষিপ্ত বিবরণ iজন্য দাঁড়িয়েছে।
  • ^ মানে, দিয়ে শুরু হয় না।
  • \d কোনও অঙ্কের সাথে মেলে।
  • a-zaএবং এর মধ্যে সমস্ত অক্ষরের সাথে মেলে ziপ্যারামিটারের কারণে আপনাকে নির্দিষ্ট করতে হবে না a-zএবং A-Z
  • \dকোনও স্থান থাকার পরে , এই রেজেজেটে ফাঁকা স্থান অনুমোদিত।

3
আমরা এই সম্পর্কে ব্যাখ্যা চাই :)। লোকেরা এখানে আসার কারণ এটি কেন see রেজেক্স ব্যাখ্যাটিও বিবেচনা করুন! সেখানে কোনও ব্যাখ্যা ছাড়াই আপনি কী লিখেছেন তা জানতে সকলেই যথেষ্ট উন্নত নয়। ধন্যবাদ
প্রতীক

@ প্রতীকসি জোশি দ্য আইটি কেস সংবেদনশীল হিসাবে বিবেচিত। ^ মানে, দিয়ে শুরু হয় না। any d কোনও অঙ্কের সাথে মেলে। a এবং z এর মধ্যে সমস্ত অক্ষরের সাথে অ্যাজ মেলে। আই প্যারামিটারের কারণে আপনাকে এজেড এবং এজেড নির্দিষ্ট করতে হবে না। \ D এর পরে একটি স্থান রয়েছে, তাই এই রেজিজেটে ফাঁকা স্থান অনুমতি দেয়।
বার্ট

1
লোকেরা উত্তর হিসাবে মন্তব্য পড়েন না । উত্তর আপডেট করুন!
প্রতীক

18

এখানে এর জন্য একটি খুব সহজ রেগেক্স রয়েছে:

\W|_

এবং আপনার প্রয়োজন হিসাবে ব্যবহৃত (একটি ফরোয়ার্ড /স্ল্যাশ ডিলিমিটার সহ)।

preg_replace("/\W|_/", '', $string);

এই দুর্দান্ত সরঞ্জামটি দিয়ে এখানে এটি পরীক্ষা করুন যা রেজেক্স কী করছে তা ব্যাখ্যা করে:

http://www.regexr.com/


1
আপনার এখনও /uপতাকা লাগবে অন্যথায় অ-অসি চিঠিগুলিও সরানো হয়েছে।
এক্সনক্রস

ঝরঝরে পরিষ্কার কিন্তু স্পেসগুলিও মেলে এবং এটি যদি চাওয়া হয় তবে সম্ভবত একটি বা একাধিকের জন্য একটি অক্ষর শ্রেণি এবং অতিরিক্ত কোয়ান্টিফায়ার ব্যবহার করে পারফরম্যান্স দ্বিগুণ করতে পারে [\W_]+
বকবিত বুদ্বুদ

18

আপনার যদি টিপিক্যাল এজেডের পরিবর্তে অন্যান্য ভাষাগুলি সমর্থন করার প্রয়োজন হয় তবে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
  • [^\p{L}\p{N} ]একটি অবহেলিত (এটি একটি চরিত্রের সাথে মিলবে যা সংজ্ঞায়িত নয় ) সংজ্ঞা দেয়:
    • \p{L}: যে কোনও ভাষা থেকে একটি চিঠি ।
    • \p{N}: যে কোনও স্ক্রিপ্টের একটি সংখ্যার চরিত্র ।
    • : একটি স্থানের অক্ষর।
  • + লোভজনকভাবে 1 এবং সীমাহীন সময়ের মধ্যে অক্ষর শ্রেণীর সাথে মেলে ।

এটি অন্যান্য ভাষা এবং স্ক্রিপ্টগুলির পাশাপাশি এজেডের চিঠি এবং সংখ্যা সংরক্ষণ করবে:

preg_replace('/[^\p{L}\p{N} ]+/', '', 'hello-world'); // helloworld
preg_replace('/[^\p{L}\p{N} ]+/', '', 'abc@~#123-+=öäå'); // abc123öäå
preg_replace('/[^\p{L}\p{N} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界

দ্রষ্টব্য: এটি একটি খুব পুরানো, তবে এখনও প্রাসঙ্গিক প্রশ্ন। আমি পরিপূরক তথ্য সরবরাহ করতে বিশুদ্ধরূপে উত্তর দিচ্ছি যা ভবিষ্যতের দর্শকদের জন্য কার্যকর হতে পারে।


8
[\W_]+

 

$string = preg_replace("/[\W_]+/u", '', $string);

এটি সমস্ত এজেড, এজেড, 0-9 নয় এবং এটি মুছুন select

এখানে উদাহরণ দেখুন: https://regexr.com/3h1rj


1
এই রেজেক্স / / \ ডাব্লু _] + / ইউ মানে?
অ্যাঞ্জেলো রিগো

\Wএর বিপরীতটি হ'ল \wঅক্ষরগুলি A-Za-z0-9_। সুতরাং \Wযে কোনও চরিত্রের সাথে মেলে না A-Za-z0-9_এবং সেগুলি মুছে ফেলবে। []একটি হল অক্ষর সেট সীমানা+একটি অক্ষর সেট সীমানা উপর অপ্রয়োজনীয় যদিও সাধারনতঃ 1 বা বেশি চরিত্র মানে। uপতাকা অভিব্যক্তি বিস্তৃতি ইউনিকোড অক্ষর সমর্থন অন্তর্ভুক্ত করা, এটা যেমন চরিত্রেও কোড 255 পরলোক অক্ষর সরানো হবে না, যার অর্থ ª²³µ। ইউনিকোড এবং এসসিআই অক্ষর সহ 3v4l.org/hSVV5 বিভিন্ন ব্যবহারের উদাহরণ ।
fyrye


0

আমিও উত্তরটির সন্ধান করছিলাম এবং আমার উদ্দেশ্য ছিল প্রতিটি নন-আলফা পরিষ্কার করা এবং সেখানে একের বেশি জায়গা থাকা উচিত নয়।
সুতরাং, আমি এ সম্পর্কে অ্যালেক্সের উত্তরটি সংশোধন করেছি এবং এটি আমার জন্য কাজ করছে preg_replace('/[^a-z|\s+]+/i', ' ', $name)
উপরের রেজেক্স ব্যাখ্যায় পরিণত sy8ed sirajul7_islamহয়েছে sy ed sirajul islam
: রিজেক্স সংবেদনশীল উপায়ে বা একাধিক সাদা স্পেস ক্ষেত্রে কোনও একটি থেকে জেড না পরীক্ষা করবে এবং এটি একটিতে রূপান্তরিত হবে স্থান।


-2

আপনি স্ট্রিংকে অক্ষরগুলিতে বিভক্ত করতে এবং ফিল্টার করতে পারেন।

<?php 

function filter_alphanum($string) {
    $characters = str_split($string);
    $alphaNumeric = array_filter($characters,"ctype_alnum");
    return join($alphaNumeric);
}

$res = filter_alphanum("a!bc!#123");
print_r($res); // abc123

?>

ডাউনভোটের কারণ: 3v4l.org/fqLVZ অধিকতর অজানা দৈর্ঘ্যের স্ট্রিংয়ে কলিং (3 + এন) ফাংশনগুলি একটি একক এবং সাধারণ preg_replace()কলের তুলনায় সত্যই অপ্রয়োজনীয় বলে মনে হচ্ছে ।
মিকম্যাকুসা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.