রেগেক্সে একটি জায়গার মিল রয়েছে


229

আমার পিএইচপি নিয়মিত প্রকাশের সাথে একটি স্পেস অক্ষর মেলে নেওয়া দরকার। কেউ ধারণা পেয়েছেন?

আমার অর্থ "গ্যাভিন স্কুলজ", দুটি শব্দের মধ্যে স্থান। আমি কেবল অক্ষর, নম্বর এবং একটি জায়গার অনুমতি দিই তা নিশ্চিত করতে আমি একটি নিয়মিত অভিব্যক্তি ব্যবহার করছি। তবে আমি স্থানটি কীভাবে সন্ধান করব তা নিশ্চিত নই। এই মুহুর্তে আমার যা আছে:

$newtag = preg_replace("/[^a-zA-Z0-9s|]/", "", $tag);

2
হুম ... একটি 'এ' বা 'বি'

1
আপনার
রেইগেক্স

উত্তর:


368

যদি আপনি কোনও স্থান সন্ধান করেন তবে তা " "(এক স্থান) হবে।

আপনি যদি এক বা একাধিক সন্ধান করেন তবে এটি " *"(এটি দুটি স্পেস এবং একটি নক্ষত্র) বা " +"(একটি স্থান এবং একটি প্লাস)।

আপনি যদি সাধারণ ব্যবধানের সন্ধান করছেন তবে ব্যবহার "[ X]"বা "[ X][ X]*"বা "[ X]+"কোথায় Xশারীরিক ট্যাব চরিত্রটি রয়েছে (এবং প্রতিটি সেই উদাহরণগুলির মধ্যে একটি একক স্থান দ্বারা পূর্ববর্তী)।

এগুলি আমি দেখেছে এমন প্রতিটি * রেজেক্স ইঞ্জিনে কাজ করবে (যার মধ্যে কিছুতে এক বা একাধিক "+"অক্ষরও নেই, উঘ)।

আপনি যদি জানেন যে আপনি আরও আধুনিক রেগেক্স ইঞ্জিনগুলির মধ্যে একটি ব্যবহার করবেন "\s"এবং এর বিভিন্নতা হ'ল উপায়। তদতিরিক্ত, আমি বিশ্বাস করি শব্দের সীমাগুলি লাইনগুলির শুরু এবং শেষের সাথে মিলে যায়, আপনি যখন এমন শব্দের সন্ধান করেন তখন যেগুলি পূর্ববর্তী বা স্পেস অনুসরণ না করে প্রদর্শিত হতে পারে।

বিশেষত পিএইচপি জন্য, এই পৃষ্ঠা সাহায্য করতে পারে।

আপনার সম্পাদনা থেকে, এটি প্রদর্শিত হয় আপনি সমস্ত অ বৈধ অক্ষর মুছে ফেলতে চান এটির সূচনাটি হ'ল (রেজেক্সের অভ্যন্তরের স্থানটি নোট করুন):

$newtag = preg_replace ("/[^a-zA-Z0-9 ]/", "", $tag);
#                                    ^ space here

আপনি যদি প্রতিটি শব্দের মধ্যে শুরু এবং শেষের মধ্যে কেবল একটিই জায়গা না রাখার বিষয়টি নিশ্চিত করতে কৌশলও চান তবে এটি কিছুটা জটিল (এবং সম্ভবত অন্য একটি প্রশ্ন) তবে মূল ধারণাটি হ'ল:

$newtag = preg_replace ("/ +/", " ", $tag); # convert all multispaces to space
$newtag = preg_replace ("/^ /", "", $tag);  # remove space from start
$newtag = preg_replace ("/ $/", "", $tag);  # and end

তাঁর আসল রেজেক্স মনে হয়েছে "" চরিত্রটি প্রতিস্থাপন করতে চান। আপনি স্থানটিকে অবহেলা করছেন, সুতরাং তার স্থানটি যেমন ইচ্ছা তেমন "মোছা" হবে না।
1-05 এ সুরোট করুন

উদ্ধৃতি: "কেবলমাত্র অক্ষর, নম্বর এবং একটি জায়গার অনুমতি দিন", গাভিনের মূল আরই ভুল ছিল (যার কারণে তিনি প্রশ্ন জিজ্ঞাসা করছেন)। আমার আরআর সব কিছু মুছে ফেলে যা এগুলির মধ্যে একটি নয়।
প্যাক্সিডিয়াবলো

মাঝখানে কেন বলার পরিবর্তে ম্যাচ প্যাটার্নের শেষে জায়গাটি থাকতে হবে?
ওয়ারেন 21

1
@ বার্ন, এটি হয় না। 'স্পেস এখানে' মন্তব্যটি স্থানটি কোথায় গেছে তা উল্লেখ করে নয় , বরং উল্লেখ করছিল যে সেখানে একটি স্থান রয়েছে (যদি পাঠক বুঝতে না পারে)।
paxdiablo

@ মাইক, না, ব্যাপারটা এমন নয়। এখানে অভিপ্রায় সমস্ত অক্ষর যে প্রতিস্থাপন করতে হয় না সেটে A-Za-z...। বর্গাকার বন্ধনীগুলির ভিতরে কেরেট এটি নির্দেশ করে। বর্গাকার বন্ধনী বাইরে ক্যারেট মুভিং ম্যাচিং অক্ষর এর অর্থ পরিবর্তন মধ্যে স্ট্রিং শুরুতে সেট।
paxdiablo


34

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

  • [[:blank:]] কেবল স্থান বা ট্যাব
  • [[:space:]] সাদা ব্যবধান
  • \s যে কোনও সাদা স্থানের অক্ষর
  • \v উল্লম্ব সাদা স্থান
  • \h অনুভূমিক সাদা স্থান
  • x সাদা স্থান উপেক্ষা করুন

5

আমার কাছে মনে হচ্ছে এই ক্ষেত্রে কোনও আরজিইএক্সএক্স ব্যবহার করা কেবল ওভারকিল হবে। কেন কেবল স্থান চরিত্রটি খুঁজে পেতে কেবল স্ট্রপোস নয়। এছাড়াও, নিয়মিত অভিব্যক্তিগুলিতে স্পেস অক্ষর সম্পর্কে বিশেষ কিছু নেই, আপনি অন্য কোনও চরিত্রের জন্য অনুসন্ধান করার মতোই এটির জন্য অনুসন্ধান করতে সক্ষম হবেন। এটি হ'ল যদি না আপনি প্যাটার্ন হোয়াইটস্পেস অক্ষম করেন, তবে এই ক্ষেত্রে খুব কমই প্রয়োজন হবে।


5

পার্লে স্যুইচটি \s(সাদা স্থান)।


16
এটি ভুল - এটি কেবল স্থানের অক্ষর নয়, সমস্ত সাদা স্থান সংগ্রহ করে।
জে টেলর

তবে প্রশ্নটি পার্লের সাথে নয়, পিএইচপি দিয়ে ট্যাগ করা আছে।
পিটার মর্টেনসেন

4

আমি কেবল অক্ষর, নম্বর এবং একটি স্থানের অনুমতি দিই তা নিশ্চিত করতে আমি একটি রেইজেক্স ব্যবহার করছি

তারপরে এটি ইতিমধ্যে যা পেয়েছে তাতে একটি স্থান যুক্ত করার মতো সহজ:

$newtag = preg_replace("/[^a-zA-Z0-9 ]/", "", $tag);

(দ্রষ্টব্য, আমি s|যা অনিচ্ছাকৃত বলে মনে হয়েছিল তা সরিয়ে দিয়েছি ? অবশ্যই এটি sঅপ্রয়োজনীয় ছিল; আপনার |যদি প্রয়োজন হয় তবে আপনি এটি পুনরুদ্ধার করতে পারেন)

আপনি যদি নির্দিষ্টভাবে কেবল একটি একক হিসাবে * একটি * স্থান চান তবে আপনার এর চেয়ে আরও জটিল ভাবের প্রয়োজন হবে এবং যুক্তির একটি পৃথক নন-রেজেক্স অংশ বিবেচনা করতে পারেন।


3

আপনি শব্দের সীমার জন্য \ b ব্যবহার করতে পারেন। নামের জন্য আমি এই জাতীয় কিছু ব্যবহার করব:

[^\b]+\b[^\b]+(\b|$)

সম্পাদনা করুন পার্ল উদাহরণস্বরূপ এটি একটি রেজেক্স হিসাবে রূপান্তর করা

if( $fullname =~ /([^\b]+)\b[^\b]+([^\b]+)(\b|$)/ ) {
 $first_name = $1;
 $last_name = $2;
}

আপনি যা চান তার উপর ভিত্তি করে আবার সম্পাদনা করুন:

$new_tag = preg_replace("/[\s\t]/","",$tag);

1

আমি এমন একটি পরিস্থিতিতে চেষ্টা করছি [[: স্পেস:]]] যেখানে দেখে মনে হচ্ছে ওয়ার্ডপ্রেসে ব্লগাররা অ-মানক স্থানের অক্ষর ব্যবহার করছে। দেখে মনে হচ্ছে এটি কাজ করবে।


1

একক জায়গার জন্য এটির মতো ব্যবহার করুন।

$newtag = preg_replace("/[^a-zA-Z0-9\s]/", "", $tag)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.