স্ট্রিং থেকে কেবল আলফা-সংখ্যাসূচক অক্ষরগুলি ফিরিয়ে আনার কাজ?


102

আমি এমন একটি পিএইচপি ফাংশন খুঁজছি যা একটি ইনপুট স্ট্রিং নেবে এবং কেবলমাত্র আলফা-সংখ্যাসূচক সমস্ত বিশেষ অক্ষর কেড়ে নিয়ে এর একটি স্যানিটাইজড সংস্করণ ফিরিয়ে দেবে।

আমার একটি দ্বিতীয় ফাংশন প্রয়োজন যা একই কাজ করে তবে কেবল বর্ণানুক্রমিক অক্ষর AZ প্রদান করে।

যে কোনও সহায়তা অনেক প্রশংসিত।


কোন ইউনিকোড নরমালাইজেশন ফর্ম এগুলিতে রয়েছে এবং আপনি কেন এটি করতে চান?
tchrist

4
আপনি যখন জেড এবং 'আলফানিউমিকিক' বলছেন, আপনি কি সত্যিই কেবল এজেড বোঝাচ্ছেন বা বিদেশী ভাষা এবং অপ্রচলিত স্ক্রিপ্টগুলি সহ সমস্ত ভাষা থেকে সমস্ত বর্ণের সাথে মিল রাখতে চান?
মার্ক বাইয়ার্স

যদি আপনি এটি করছেন যাতে আপনি অ্যাকসেন্ট-সংবেদনশীল স্ট্রিং তুলনা করতে পারেন তবে আপনি ভুল কাজটি করছেন।
tchrist

4
এটা না শুধু "সমস্ত ভাষা থেকে"। এটা ইংরেজি। ইংরেজি লাতিন স্ক্রিপ্ট ব্যবহার করে। এখানে unichars '\p{Latin}' '\p{Alphabetic}' '[^A-Za-z]' | wc -l== 1192 কোড পয়েন্ট রয়েছে যে লাতিন বর্ণমালা কিন্তু এজেড নয়। এটি সাধারণত পৌরাণিক কাহিনী হিসাবে ধরা হয় যে ASCII ইংরেজি জন্য যথেষ্ট। এটি নয়, এবং এ কারণেই এজেড লেখার একটি কোডের গন্ধ আছে।
tchrist

4
@ স্কট বি: ইংরাজীরা কেবল এজেডের 26 টি অক্ষর ব্যবহার করে না। উদাহরণস্বরূপ Résum word শব্দের মধ্যে é রয়েছে é আপনি কী করতে চাইছেন তা সম্ভবত আপনি ব্যাখ্যা করতে পারেন কারণ এটি আপনাকে আরও ভাল উত্তর পেতে সহায়তা করতে পারে।
মার্ক বাইয়ার্স

উত্তর:


220

সতর্কতা: নোট করুন যে ইংরেজি কেবল AZ- তে সীমাবদ্ধ নয়।

ব্যবহার করে দেখুন এই AZ, জেড এবং 0-9 ছাড়া সবকিছু মুছে ফেলার জন্য:

$result = preg_replace("/[^a-zA-Z0-9]+/", "", $s);

আপনার বর্ণানুক্রমিক সংজ্ঞায় বিদেশী ভাষা এবং অপ্রচলিত স্ক্রিপ্টগুলিতে বর্ণগুলি অন্তর্ভুক্ত থাকে তবে আপনাকে ইউনিকোড অক্ষর শ্রেণি ব্যবহার করতে হবে।

ব্যবহার করে দেখুন এই শুধুমাত্র জেড ত্যাগ করার:

$result = preg_replace("/[^A-Z]+/", "", $s);

সতর্কতার কারণ হ'ল রেসুমার মতো শব্দগুলিতে এমন একটি চিঠি রয়েছে যা এর éসাথে মেলে না। আপনি যদি একটি নির্দিষ্ট বর্ণের তালিকার সাথে মেলে করতে চান তবে সেই অক্ষরগুলি অন্তর্ভুক্ত করার জন্য নিয়মিত অভিব্যক্তিটি সামঞ্জস্য করুন। আপনি যদি সমস্ত বর্ণের সাথে মেলে রাখতে চান তবে মন্তব্যে বর্ণিত যথাযথ চরিত্রের ক্লাস ব্যবহার করুন।


4
না, একটি বর্ণমালা হয় [\p{Alphabetic}\p{Numeric}]। আমি পিসিআরআই বর্ণমালার সম্পত্তি ভুলে গেছি তবে আপনি এটি দিয়ে আনুমানিক আনতে পারেন [\pL\pM\pN]
tchrist

4
@ ক্রিশ্চ: আমি ধরে নিলাম কারণ তিনি এজেডের উল্লেখ করেছেন যে তিনি কেবল এটিই মিলতে চান, যদিও আমি স্বীকার করি যে প্রশ্নটি এই বিষয়টিতে আরও অনেক পরিষ্কার হতে পারে। আমি স্পষ্টতা চাইব।
মার্ক বাইয়ার্স

4
@ মারক, আমি আপনার উত্তরের দ্বিতীয় অংশ নিয়ে বিতর্ক করছিলাম না, যদিও তিনি প্রথমে স্ট্রিংটি প্রথমে পচে না ফেলে, এটি সঠিকভাবে কাজ করবে না। আমি প্রথম অংশ নিয়ে তর্ক করছিলাম। এছাড়াও, আমি সর্বদা চেষ্টা করি কেবল রেজিেক্সগুলি ঠিক যে কেবল কোনও ছাঁচে থাকা পুরানো এএসসিআই-তে নয়, যে কোনও ডেটা নিয়ে কাজ করে । :) অতএব মিলেনিয়ামের এই দিকটি[A-Z]
tchrist

4
@ মার্ক বাইয়ার্স, আমি দেখি .. এবং হ্যাঁ আমি এটিকে পছন্দ করি iতবে আমাকে কেবল ইংরেজী জনসংখ্যার বিষয়ে চিন্তা করতে হবে .. আমি ভুলে যাই যে অনেক লোককে অন্য ভাষা সম্পর্কে ভাবতে হবে। বিটিডব্লিউ আমি সবেমাত্র লক্ষ্য করেছি যে আপনি সর্বোচ্চ প্রতিযোগিতামূলক ব্যবহারকারী যিনি কখনও 1 টি প্রশ্ন করেন নি। এমনকি জন স্কিটি এর আগেও প্রশ্ন করেছে!
জেডি আইজ্যাকস

4
রেজিপেক্সের শেষে কেন একটি + আছে? আপনি যদি এটি মুছে ফেলেন তবে কি একই হবে না?
ডেনিস

2

পরিবর্তে preg_replace, আপনি সর্বদা পিএইচপি এর ফিল্টারfilter_var() ফাংশনটি সাথে ফাংশনটি ব্যবহার করে ব্যবহার করতে পারেন FILTER_SANITIZE_STRING


পিএসপিএফ এর কি আইএসও স্ট্রিংপ্রেপ অ্যালগরিদম অ্যাক্সেস রয়েছে? আমি পার্ল এবং জাভা জানি।
tchrist

আমি বিশ্বাস করি যে স্ট্রিং ফিল্টার ফাংশনটি মূলত 7-বিট ASCII এর সাথে কাজ করে, তবে সে সম্পর্কে আমাকে উদ্ধৃতি দেবেন না।
মার্ক বেকার 21

31
অনুগ্রহ করে, আপনি কি আমাদের ব্যবহারের জন্য জিজ্ঞাসা করছেন তা করার একটি সুস্পষ্ট উপায় বলতে পারেন FILTER_SANITIZE_STRING? আমার জ্ঞানের মতে, এইভাবে আর্কাইভ করা যেতে পারে এমন নিকটতমটি এর সাথে রয়েছে FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGHতবে এটি কেবল অক্ষর এবং সংখ্যা ছাড়বে না তবে বিন্দু, স্ল্যাশ, পার্সেন্টস এবং এগুলি সবই ছেড়ে দেবে।
পেরে

4
এটিকে উত্তরের চেয়ে মন্তব্যের মতো মনে হচ্ছে। উত্তর লেখার সময় যথাযথ ব্যাখ্যা দিন।
সিরাজ আলম

4
আমি বিশ্বাস করি না যে দুর্ভাগ্যক্রমে, সেখানে বর্ণমুখে একটি প্রকৃত FILTER_SANITIZE আছে। খুব বড় বাদ।
কাজকাই

0
  1. [ 0-9 ] সংখ্যা এবং সাধারণভাবে বর্ণমালা [ \ পিএল ] এর জন্য স্যানিটাইজ করুন :
$string = preg_replace("/[^0-9\pL]+/", "", $string)
  1. এ থেকে জেড (কেস-সংবেদনশীল) [ a-zA-Z ] বর্ণমালাগুলির জন্য বিশেষত সান্টাইজ করুন :
$string = preg_replace("/[^a-zA-Z]+/", "", $string)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.