কীভাবে পাস্কাল কেসকে প্যাসকাল_কে রূপান্তর করবেন?


115

যদি আমার থাকত:

$string = "PascalCase";

আমার দরকার

"pascal_case"

পিএইচপি কি এই উদ্দেশ্যে কোনও ফাংশন অফার করে?


31
প্রযুক্তিগতভাবে, প্রথম উদাহরণটির স্ট্রিংটি প্যাসকেলকেস।
রবিন ভ্যান বালেন

33
এবং দ্বিতীয় উদাহরণের স্ট্রিংটি সাপ_কেস হিসাবে পরিচিত ।
পাং

উত্তর:


163

আকারের জন্য এটি ব্যবহার করে দেখুন:

$tests = array(
  'simpleTest' => 'simple_test',
  'easy' => 'easy',
  'HTML' => 'html',
  'simpleXML' => 'simple_xml',
  'PDFLoad' => 'pdf_load',
  'startMIDDLELast' => 'start_middle_last',
  'AString' => 'a_string',
  'Some4Numbers234' => 'some4_numbers234',
  'TEST123String' => 'test123_string',
);

foreach ($tests as $test => $result) {
  $output = from_camel_case($test);
  if ($output === $result) {
    echo "Pass: $test => $result\n";
  } else {
    echo "Fail: $test => $result [$output]\n";
  }
}

function from_camel_case($input) {
  preg_match_all('!([A-Z][A-Z0-9]*(?=$|[A-Z][a-z0-9])|[A-Za-z][a-z0-9]+)!', $input, $matches);
  $ret = $matches[0];
  foreach ($ret as &$match) {
    $match = $match == strtoupper($match) ? strtolower($match) : lcfirst($match);
  }
  return implode('_', $ret);
}

আউটপুট:

Pass: simpleTest => simple_test
Pass: easy => easy
Pass: HTML => html
Pass: simpleXML => simple_xml
Pass: PDFLoad => pdf_load
Pass: startMIDDLELast => start_middle_last
Pass: AString => a_string
Pass: Some4Numbers234 => some4_numbers234
Pass: TEST123String => test123_string

এটি নিম্নলিখিত নিয়মগুলি প্রয়োগ করে:

  1. ছোট হাতের অক্ষর দিয়ে শুরু হওয়া একটি ক্রম অবশ্যই ছোট হাতের অক্ষর এবং অঙ্কগুলি অনুসরণ করে;
  2. বড় হাতের অক্ষর দিয়ে শুরু হওয়া একটি অনুক্রম অনুসরণ করা যেতে পারে:
    • এক বা একাধিক বড় হাতের অক্ষর এবং অঙ্ক (স্ট্রিংয়ের শেষে বা একটি বড় হাতের অক্ষর যার পরে ছোট হাতের অক্ষর বা অঙ্ক অর্থাৎ পরবর্তী অনুক্রমের শুরু); অথবা
    • এক বা একাধিক ছোট অক্ষর বা সংখ্যা s

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

1
কৌতূহল কেন আপনি পরীক্ষা করছেন যে স্ট্রিং সমস্ত ক্যাপস স্ট্রিংয়ের সাথে মেলে কিনা? প্রথম অক্ষরটিকে ছোট হাতের (সমস্ত চরিত্রের বিপরীতে) রূপান্তর করার সুবিধা কী?
জোশ

1
আরও সংক্ষিপ্ত সমাধান যে এই সব ব্যবহারের ক্ষেত্রে সব ব্যবস্থা করতে সক্ষম: stackoverflow.com/a/35719689/4328383
Syone

156

একটি সংক্ষিপ্ত সমাধান: সরল নিয়মিত অভিব্যক্তি এবং "ট্রেলিং-আন্ডারস্কোর" সমস্যাটি ঠিক করার সাথে সম্পাদকের অনুরূপ :

$output = strtolower(preg_replace('/(?<!^)[A-Z]/', '_$0', $input));

পিএইচপি ডেমো | রেজেক্স ডেমো


নোট করুন যে এর মতো মামলাগুলি উপরের সমাধানটি ব্যবহার করে SimpleXMLরূপান্তরিত হবে simple_x_m_l। এটিকে SimpleXmlঅ্যালগরিদমের পরিবর্তে উটের ক্ষেত্রে চিহ্নিতকরণ (সঠিক হবে ) এর একটি ভুল ব্যবহার হিসাবেও বিবেচনা করা যেতে পারে যেহেতু এই ধরনের ক্ষেত্রে সর্বদা অস্পষ্ট থাকে - এমনকি বড় হাতের অক্ষরকে একটি স্ট্রিং ( simple_xml) এ গ্রুপযুক্ত করেও এই ধরণের অ্যালগোরিদম সর্বদা অন্যান্য প্রান্তের ক্ষেত্রে ব্যর্থ হয় মত XMLHTMLConverterঅথবা এক অক্ষর বর্ণমালা, ইত্যাদি কাছাকাছি শব্দ আপনি (বরং বিরল) প্রান্ত মামলা সম্পর্কে কিছু মনে না করেন এবং হাতল করতে চান SimpleXMLসঠিকভাবে আপনি একটি সামান্য আরো জটিল সমাধান ব্যবহার করতে পারেন:

$output = ltrim(strtolower(preg_replace('/[A-Z]([A-Z](?![a-z]))*/', '_$0', $input)), '_');

পিএইচপি ডেমো | রেজেক্স ডেমো


আপনি কোন পরীক্ষার মামলাগুলি স্থির করেছেন সে সম্পর্কে ক্লিটসের উত্তরের বিষয়ে নির্দ্বিধায় মন্তব্য করুন।
মাইক বি

3
আমি বলছি না যে তার সমাধানটি ভুল ফল দেয়। তার সমাধানটি কেবল অত্যন্ত জটিল এবং অকার্যকর।
জান জেকš

1
হ্যাঁ, গ্রহণযোগ্য উত্তর অবশ্যই একটি ব্যর্থ। জান এর সমাধান দারুণ! পার্শ্ব নোট হিসাবে, আমি এই পিএইচপি বিকাশকারীদের জন্য আমার (বা কিছুটা ভিন্নতা) আমার নতুন, প্রিয় কোডিং পরীক্ষা বলে মনে করি, কারণ এই প্রশ্নের উত্তর প্রদানের সংখ্যাটি যা আসলে কাজ করে না অবিশ্বাস্য। প্রাথমিক ফিল্টারিংয়ের জন্য এটি দুর্দান্ত উপায় হবে। :-)
জেমসজি

: Regex এই সমাধান ব্যবহৃত আরো অনেক সম্পূর্ণ পাওয়া stackoverflow.com/questions/2559759/...
thoroc

2
সাধারণ ব্যবহারের ক্ষেত্রে খুব ভাল সমাধান এবং বেশিরভাগ ক্ষেত্রে এটি যথেষ্ট তবে গ্রহণযোগ্য সমাধান আরও ব্যবহারের ক্ষেত্রে পরিচালনা করতে পারে, উদাহরণস্বরূপ "সিম্পল এক্সএমএল" "সরল_এক্সএমএল" তে রূপান্তরিত হতে পারে এবং "সরল_এক্স_ম_এল" নয়
সায়োন

35

একটি সংক্ষিপ্ত সমাধান এবং কিছু জটিল ব্যবহারের মামলা পরিচালনা করতে পারে:

function decamelize($string) {
    return strtolower(preg_replace(['/([a-z\d])([A-Z])/', '/([^_])([A-Z][a-z])/'], '$1_$2', $string));
}

এই সমস্ত ক্ষেত্রে পরিচালনা করতে পারেন:

simpleTest => simple_test
easy => easy
HTML => html
simpleXML => simple_xml
PDFLoad => pdf_load
startMIDDLELast => start_middle_last
AString => a_string
Some4Numbers234 => some4_numbers234
TEST123String => test123_string
hello_world => hello_world
hello__world => hello__world
_hello_world_ => _hello_world_
hello_World => hello_world
HelloWorld => hello_world
helloWorldFoo => hello_world_foo
hello-world => hello-world
myHTMLFiLe => my_html_fi_le
aBaBaB => a_ba_ba_b
BaBaBa => ba_ba_ba
libC => lib_c

আপনি এখানে এই ফাংশনটি পরীক্ষা করতে পারেন: http://syframework.alwaysdata.net/dameamelize


@ বিবেক বর্ধন এই রেজেক্সের কোন অংশটি আপনি বুঝতে পারছেন না?
সাইন

উহম, আমি মনে করি যে উট কেসস বিন্যাসে স্ট্রিংটি না থাকলে আসলটি ফিরিয়ে দেওয়া উচিত, যদি কম ক্যামেরাসহীন স্ট্রিংগুলি নিম্নতর করা একটি পার্শ্ব প্রতিক্রিয়া। আপনি যদি 'সিম্পল_সেক্সট' প্রেরণ করেন তবে আপনি ব্যর্থ হন: সিম্পল_স্টেস্ট => সরল_তম [সরল_তম] test লোয়ারকেসিং স্ট্রিংটি কেবলমাত্র তৈরি করা উচিত এবং কেবল যদি মূল স্ট্রিংটি একটি আসল উটের কেস স্ট্রিং হয়। তুমি কি মনে কর?
গাইডো

24

রুবির String#camelizeএবং থেকে পোর্ট করা হয়েছে String#decamelize

function decamelize($word) {
  return preg_replace(
    '/(^|[a-z])([A-Z])/e', 
    'strtolower(strlen("\\1") ? "\\1_\\2" : "\\2")',
    $word 
  ); 
}

function camelize($word) { 
  return preg_replace('/(^|_)([a-z])/e', 'strtoupper("\\2")', $word); 
}

উপরের সমাধানগুলি মিস করতে পারে এমন একটি কৌশল হ'ল 'ই' সংশোধক যা preg_replaceপিএইচপি কোড হিসাবে প্রতিস্থাপনের স্ট্রিংকে মূল্যায়নের কারণ করে।


10
এর eজন্য পতাকা preg_replaceপিএইচপি 5.5-এ অবচয় করা হচ্ছে।
সিডিএমকেই

বিটিডাব্লু এগুলি রুবিতে নেই, তবে রেলের 'ইনফ্লেক্টর লাইব্রেরিতে' উটলাইজ এবং আন্ডারস্কোর। api.rubyonrails.org/classes/ActtiveSupport/Iffector.html
mahemoff

2
এটি "এইআইএসএটিস্ট" এর জন্য ব্যর্থ। মনে হয় যা পরপর দুটি বড় হাতের অক্ষর সমর্থন করে না।
ওনাবাই

কেবলমাত্র একটি নোট: আপনি ছোট অক্ষরে প্রথম অক্ষর পেতে lcfirst ব্যবহার করতে পারেন, তারপরে আপনার প্রয়োজন হবে না ^|বা strlen
বেনুবার্ড

অবচয় ছাড়াই ডেসিমেলাইজ করুন: gist.github.com/scones/e09c30e696246fda14578bcf8ab4910a
স্কোন করে

23

Symfony Serializer কম্পোনেন্ট টি CamelCaseToSnakeCaseNameConverter দুটি পদ্ধতি আছে যা normalize()এবং denormalize()। এগুলি নিম্নলিখিত হিসাবে ব্যবহার করা যেতে পারে:

$nameConverter = new CamelCaseToSnakeCaseNameConverter();

echo $nameConverter->normalize('camelCase');
// outputs: camel_case

echo $nameConverter->denormalize('snake_case');
// outputs: snakeCase

1
সতর্ক থাকুন! $nameConverter->normalize('CamelCase')আউটপুট _camel_caseSymfony Serializer কম্পোনেন্ট এর বর্তমান সংস্করণ 3.2 হবে।
spackmat

21

বেশিরভাগ সমাধান এখানে ভারী হাতে অনুভূত হয়। আমি যা ব্যবহার করি তা এখানে:

$underscored = strtolower(
    preg_replace(
        ["/([A-Z]+)/", "/_([A-Z]+)([A-Z][a-z])/"], 
        ["_$1", "_$1_$2"], 
        lcfirst($camelCase)
    )
);

"ক্যামেলসিএএসই" কে "উট_ক্যাসে" রূপান্তরিত করা হয়েছে

  • lcfirst($camelCase) প্রথম অক্ষরটি কমিয়ে দেবে (আন্ডারস্কোর দিয়ে শুরু করতে 'ক্যামেলসিএএসই' রূপান্তরিত আউটপুট এড়ানো হবে)
  • [A-Z] বড় অক্ষর খুঁজে
  • + একটানা প্রতিটি বড় হাতের অক্ষরকে একটি শব্দ হিসাবে বিবেচনা করবে (উট_সি_এ_স_ইতে রূপান্তরিত করতে 'ক্যামেলসিএএসই' এড়ানো হবে)
  • দ্বিতীয় প্যাটার্ন এবং প্রতিস্থাপনের পরিবর্তে ThoseSPECCases->those_spec_casesthose_speccases
  • strtolower([…]) আউটপুটটিকে ছোট হাতের দিকে পরিবর্তিত করে

3
তবে এটি ক্যামেল কেসকে _ ক্যামেল_সেসে পরিণত করে।
acme

1
এটি দুর্দান্ত - এই সমস্যাটি পেতে কেবল চরে 1 এ শুরু হওয়া একটি সাবস্টর যুক্ত করুন।
ওডম্যান

4
Excelent! কেবলমাত্র lcfirst$ উট কেসে ফাংশন যুক্ত করতে হবে
এডাকোস

গৃহীত উত্তর হ্যান্ডল করবে: টেস্ট ইউপিএসক্লাসটি টেস্ট_আপস_ক্লাসে পরিণত হবে যখন এটি এটিকে পরীক্ষার_উ_পি_এস_ক্লাসে পরিণত করবে, কিছু মনে রাখবেন।
মজ্জি

একটি ইনপুট স্ট্রিং যা প্রথম "শব্দ" অলক্যাপসের সাথে শুরু হয় কলটির কারণে এই সমাধান দ্বারা অপ্রত্যাশিতভাবে বিভক্ত হবে ucfirst()ডেমোUSADollarSymbol হয়ে যায় আমি এই সমাধানটির প্রস্তাব দিই না কারণ এতে রেগেক্সের সাহায্যে ইনপুট স্ট্রিং দিয়ে দুটি পাস করতে হবে - একটি অপরিশোধিত প্যাটার্নের লক্ষণ। u_sa_dollar_symbol
মিকম্যাকুসা

19

পিএইচপি এই আফিকের জন্য বিল্ট ইন ফাংশন সরবরাহ করে না, তবে আমি এখানে ব্যবহার করি

function uncamelize($camel,$splitter="_") {
    $camel=preg_replace('/(?!^)[[:upper:]][[:lower:]]/', '$0', preg_replace('/(?!^)[[:upper:]]+/', $splitter.'$0', $camel));
    return strtolower($camel);

}

বিভাজনটি ফাংশন কলে নির্দিষ্ট করা যায়, তাই আপনি এটির মতো কল করতে পারেন

$camelized="thisStringIsCamelized";
echo uncamelize($camelized,"_");
//echoes "this_string_is_camelized"
echo uncamelize($camelized,"-");
//echoes "this-string-is-camelized"

2
এটি "এইআইএসএটিস্ট" এর জন্য ব্যর্থ। মনে হয় যা পরপর দুটি বড় হাতের অক্ষর সমর্থন করে না।
ওনাবাই

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

8

আপনার এটির মাধ্যমে একটি রেজেক্স চালানো দরকার যা প্রতিটি বড় হাতের অক্ষরের সাথে মিল থাকে তবে শুরুতে হয় এবং এটিকে আন্ডারক্রোর প্লাসের সাথে প্রতিস্থাপন করে। একটি utf-8 সমাধানটি হ'ল:

header('content-type: text/html; charset=utf-8');
$separated = preg_replace('%(?<!^)\p{Lu}%usD', '_$0', 'AaaaBbbbCcccDdddÁáááŐőőő');
$lower = mb_strtolower($separated, 'utf-8');
echo $lower; //aaaa_bbbb_cccc_dddd_áááá_őőőő

যদি আপনার স্ট্রিংটি কীসের বিষয়ে নিশ্চিত না হন তবে প্রথমে এটি পরীক্ষা করা ভাল, কারণ এই কোডটি ধরে নিয়েছে যে ইনপুট camelCaseপরিবর্তে underscore_Caseবা এর পরিবর্তে রয়েছে dash-Case, সুতরাং যদি উত্তরগুলির মধ্যে বড় হাতের অক্ষর থাকে তবে এটি তাদের মধ্যে আন্ডারস্কোর যুক্ত করবে।

ক্লিটাসের গৃহীত উত্তরটি হ'ল অতিমাত্রায় জটিল im এবং এটি লাতিন অক্ষরের সাথেই কাজ করে। আমি এটি একটি খুব খারাপ সমাধান খুঁজে পেয়েছি এবং কেন এটি একেবারেই গৃহীত হয়েছিল তা অবাক করে দিয়েছি। রূপান্তর TEST123Stringকরা test123_stringকোনও বৈধ প্রয়োজনীয়তা নয়। আমি বরং এটিকে সহজ এবং পরিবর্তে পৃথক ABCcccকরে রেখেছি কারণ এটি এইভাবে তথ্য হারাবে না এবং পশ্চাদপদ রূপান্তরটি ঠিক একই স্ট্রিংটি দিয়ে শুরু করবে যা আমরা শুরু করেছি। এমনকি আপনি যদি অন্যভাবে এটি করতে চান তবে আপনি যদি কোনও রেজেক্স বিশেষজ্ঞ না হন তবে ইতিবাচক লুকবিহিন্ড বা লিকবিহাইন্ড ব্যতীত দুটি রেজিেক্স সহ এটির জন্য একটি রেজেক্স লিখতে তুলনামূলক সহজ । এটিকে সাবস্ট্রিংগুলিতে বিভক্ত করার দরকার নেই এবং সিদ্ধান্ত নেওয়ার মধ্যে যেটি কেবল ব্যবহার করা সম্পূর্ণ জরিমানা হবে তা উল্লেখ না করে ।a_b_ccccab_cccc(?<!^)\p{Lu}\p{Ll}|(?<=\p{Ll})\p{Lu}strtolowerlcfirststrtolower


কোড-কেবলমাত্র উত্তরগুলি স্ট্যাকওভারফ্লোতে স্বল্প মূল্য কারণ তারা হাজার হাজার ভবিষ্যত গবেষককে শিক্ষিত / ক্ষমতাবান করতে খুব কম কাজ করে।
মিকম্যাকুসা

@ মিকম্যাকুসা যদি গবেষকরা এসও থেকে কোড কীভাবে শিখেন তবে আমাদের একটি গুরুতর সমস্যা হয় ...
inf3rno

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

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

@ মিকম্যাকুসা আমার মনে হয় না আমি এটি মুছে ফেলতে পারি। আপনি যদি চান তা এডিট নির্দ্বিধায়।
inf3rno

6

আপনি যদি পিএইচপি 5.4 সংস্করণ সন্ধান করছেন এবং পরে উত্তরটি এখানে দেওয়া হয়:

function decamelize($word) {
      return $word = preg_replace_callback(
        "/(^|[a-z])([A-Z])/",
        function($m) { return strtolower(strlen($m[1]) ? "$m[1]_$m[2]" : "$m[2]"); },
        $word
    );

}
function camelize($word) {
    return $word = preg_replace_callback(
        "/(^|_)([a-z])/",
        function($m) { return strtoupper("$m[2]"); },
        $word
    );

} 

ক্যামিটাইজ এসএমএস_সেন্টের জন্য "এসএমএসসেন্ট" তৈরি করে, আপনার একটি এলসিফায়ার্স দরকার
mik3fly-4steri5k

4

অভিনব নয় মোটেও সহজ এবং দ্রুত জাহান্নাম হিসাবে:

function uncamelize($str) 
{
    $str = lcfirst($str);
    $lc = strtolower($str);
    $result = '';
    $length = strlen($str);
    for ($i = 0; $i < $length; $i++) {
        $result .= ($str[$i] == $lc[$i] ? '' : '_') . $lc[$i];
    }
    return $result;
}

echo uncamelize('HelloAWorld'); //hello_a_world

++$iপরিবর্তে $i++এটিকে কিছুটা দ্রুততর করা হবে;)
ম্যাথিউ অ্যামিয়ট

কোড-কেবলমাত্র উত্তরগুলি স্ট্যাকওভারফ্লোতে স্বল্প মূল্য কারণ তারা হাজার হাজার ভবিষ্যত গবেষককে শিক্ষিত / ক্ষমতাবান করতে খুব কম কাজ করে।
মিকম্যাকুসা

4

"ক্যামেলকেস" থেকে "উট_ক্যাস":

function camelToSnake($camel)
{
    $snake = preg_replace('/[A-Z]/', '_$0', $camel);
    $snake = strtolower($snake);
    $snake = ltrim($snake, '_');
    return $snake;
}

বা:

function camelToSnake($camel)
{
    $snake = preg_replace_callback('/[A-Z]/', function ($match){
        return '_' . strtolower($match[0]);
    }, $camel);
    return ltrim($snake, '_');
}

ধন্যবাদ. আমি প্রথম পন্থাটি ব্যবহার করেছি, তবে this-kind-of-output
হাইফেনগুলি

3

রিজেক্স ব্যবহার না করে এমন একটি সংস্করণ আলচিটেক্ট উত্সে পাওয়া যাবে :

decamelize($str, $glue='_')
{
    $counter  = 0;
    $uc_chars = '';
    $new_str  = array();
    $str_len  = strlen($str);

    for ($x=0; $x<$str_len; ++$x)
    {
        $ascii_val = ord($str[$x]);

        if ($ascii_val >= 65 && $ascii_val <= 90)
        {
            $uc_chars .= $str[$x];
        }
    }

    $tok = strtok($str, $uc_chars);

    while ($tok !== false)
    {
        $new_char  = chr(ord($uc_chars[$counter]) + 32);
        $new_str[] = $new_char . $tok;
        $tok       = strtok($uc_chars);

        ++$counter;
    }

    return implode($new_str, $glue);
}


4
হ্যাঁ, হ্যাঁ RegEx এর অবশ্যই এর সুবিধাগুলি রয়েছে। :) কাঁচা গতি তাদের মধ্যে একটি নয়।
ড্যারেল ব্রোগডন

কোনও কারণে
এইটির

এই স্ট্রিংয়ের উপর ভিত্তি করে আমার পক্ষে কাজ করে না: "ক্যামেলকেসটেষ্টএএএটিস্টএএ" থাকতে হবে: "উট_ক্যাস_প্রেম_এ_এ_এ_টেষ্ট_এ_এ" থাকতে হবে: "" উট_কেস_টেষ্ট_স্টেস্ট "...
সিবিও

3

সুতরাং এখানে একটি ওয়ান-লাইনার রয়েছে:

strtolower(preg_replace('/(?|([a-z\d])([A-Z])|([^\^])([A-Z][a-z]))/', '$1_$2', $string));

দুর্দান্ত, তবে এটি কেবল প্রথম উপস্থিতিকে রূপান্তরিত করে, তাই আমি gএই রেজেক্সে কোনও সংশোধক যুক্ত করার পরামর্শ দেব ।
acme

@ একমি, আমি এটি ব্যবহার না করেই gএটি আমার পক্ষে ভাল কাজ করে।
Sets

আমার ক্ষেত্রে কোনও কারণে আমাকে যুক্ত করতে হয়েছিল g। তবে আমি যে বাক্যটি দিয়ে পরীক্ষা করেছি তা মনে করতে পারছি না।
acme

3

ড্যানিয়েলস্টজুলস / স্ট্রিংগি স্ট্রিংকে ক্যামেলকেস থেকে স্নেককেসে রূপান্তরিত করার জন্য একটি পদ্ধতি দেয়।

s('TestUCase')->underscored(); // 'test_u_case'

3

লারাভেল 5.6 এটি করার একটি খুব সহজ উপায় সরবরাহ করে:

 /**
 * Convert a string to snake case.
 *
 * @param  string  $value
 * @param  string  $delimiter
 * @return string
 */
public static function snake($value, $delimiter = '_'): string
{
    if (!ctype_lower($value)) {
        $value = strtolower(preg_replace('/(.)(?=[A-Z])/u', '$1'.$delimiter, $value));
    }

    return $value;
}

এটি কী করে: যদি এটি দেখায় যে প্রদত্ত স্ট্রিংয়ে কমপক্ষে একটি বড় হাতের অক্ষর রয়েছে, তবে এটি কোনও অক্ষর ( ) এর পরে মূল অক্ষর ( ) এর পরে অনুসন্ধান করার জন্য একটি ইতিবাচক চেহারা ব্যবহার .করে (?=[A-Z])। এরপরে এটি পাওয়া অক্ষরের পরিবর্তে এর মানটির সাথে পৃথককারীকে অনুসরণ করে _


এই ফাংশনটিকে এখন স্নাপকেস () বলা হয় এবং এটি বিশ্বব্যাপী নেমস্পেসে বাস করে।
Wotuu

2

রেল থেকে সরাসরি বন্দর (:: বা সংক্ষিপ্ত নামগুলির জন্য তাদের বিশেষ হ্যান্ডলিং বিয়োগ) হবে

function underscore($word){
    $word = preg_replace('#([A-Z\d]+)([A-Z][a-z])#','\1_\2', $word);
    $word = preg_replace('#([a-z\d])([A-Z])#', '\1_\2', $word);
    return strtolower(strtr($word, '-', '_'));
}

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

প্রাসঙ্গিক রেল উত্স কোডও পরীক্ষা করে দেখুন

নোট করুন যে এটি ASCII সনাক্তকারীদের সাথে ব্যবহারের উদ্দেশ্যে intended আপনার যদি ASCII সীমার বাইরে অক্ষরগুলি দিয়ে এটি করতে হয় তবে ব্যবহার করতে '/ u' পরিবর্তনকারীটি preg_matchব্যবহার করুন mb_strtolower


আপনি করতে পারেন, যদি আপনি কেবল একটি প্যারামিটার যুক্ত করেন যা পছন্দসই অক্ষরটি ধারণ করে।
ফ্লেশগ্রিন্ডার

2

Godশ্বরের সাথে ছয় বছরের পুরানো প্রশ্নে আমার অবদান এখানে কত জবাব জানে ...

এটি প্রদত্ত স্ট্রিংয়ের সমস্ত শব্দকে যা ক্যামেলকেসকে স্নেককেসে রূপান্তরিত করবে। উদাহরণস্বরূপ "সুপারস্পেশিয়ালউইউজ এবং ফিজবউজ καιΚάτιΑκόμα" কে "সুপার_স্পেশাল_ওয়াসাল এবং ফিজ_বজ και_κάτι_ακόμα" তে রূপান্তর করা হবে।

mb_strtolower(
    preg_replace_callback(
        '/(?<!\b|_)\p{Lu}/u',
        function ($a) {
            return "_$a[0]";
        },
        'SuperSpecialAwesome'
    )
);

2

ক্যামেলকেস থেকে স্নাইকেস শব্দটি তৈরির জন্য Yii2 এর আলাদা ফাংশন রয়েছে।

    /**
     * Converts any "CamelCased" into an "underscored_word".
     * @param string $words the word(s) to underscore
     * @return string
     */
    public static function underscore($words)
    {
        return strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $words));
    }


2

আমার অনুরূপ সমস্যা ছিল তবে কোনও উত্তর খুঁজে পেল না যা ক্যামেলকেসকে সাপ_কেসে রূপান্তর করতে পারে তা সন্তুষ্ট করে, যখন _আন্ডারস্কোর, বা সমস্ত ক্যাপ সংক্ষেপের সাথে নামগুলির জন্য সদৃশ বা অনর্থক আন্ডারস্কোরগুলি এড়িয়ে যায় ।

নীচে সমস্যাটি হ'ল:

CamelCaseClass            => camel_case_class
ClassName_WithUnderscores => class_name_with_underscore
FAQ                       => faq

আমি যে সমাধানটি লিখেছি তা হ'ল একটি সহজ দুটি ফাংশন কল, ছোট হাতের অক্ষর এবং সন্ধান এবং একটানা ছোট ছোট হাতের অক্ষরের জন্য প্রতিস্থাপন:

strtolower(preg_replace("/([a-z])([A-Z])/", "$1_$2", $name));

এখন পর্যন্ত এটি সর্বাধিক সংক্ষিপ্ত এবং দরকারী সমাধান আইএমও।
মিঃশান0

1
function camel2snake($name) {
    $str_arr = str_split($name);
    foreach ($str_arr as $k => &$v) {
        if (ord($v) >= 64 && ord($v) <= 90) { // A = 64; Z = 90
            $v = strtolower($v);
            $v = ($k != 0) ? '_'.$v : $v;
        }
    }
    return implode('', $str_arr);
}

আপনি সরাসরি $name{$k}(বা।) ব্যবহার করে চরগুলি অ্যাক্সেস করতে পারেন$name[$k] ) যা আপনার কোডটি দীর্ঘায়িত করবে তবে এটিকে অ্যারেতে এবং রূপান্তরিত করার বৃহত ওভারহেডকে এড়িয়ে চলে।
বোডো

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

1

এখানে সবচেয়ে খারাপ উত্তরটি সেরা হওয়ার খুব কাছাকাছি ছিল (একটি কাঠামো ব্যবহার করুন)। না, কেবল উত্স কোডটি একবার দেখুন। একটি সুপ্রতিষ্ঠিত কাঠামো কী ব্যবহার করে তা আরও নির্ভরযোগ্য পদ্ধতির (চেষ্টা ও পরীক্ষিত) হবে। জেন্ডার কাঠামোর কিছু শব্দ ফিল্টার রয়েছে যা আপনার প্রয়োজনের সাথে খাপ খায়। উত্স

উত্স থেকে আমি অভিযোজিত কয়েকটি পদ্ধতি এখানে রয়েছে।

function CamelCaseToSeparator($value,$separator = ' ')
{
    if (!is_scalar($value) && !is_array($value)) {
        return $value;
    }
    if (defined('PREG_BAD_UTF8_OFFSET_ERROR') && preg_match('/\pL/u', 'a') == 1) {
        $pattern     = ['#(?<=(?:\p{Lu}))(\p{Lu}\p{Ll})#', '#(?<=(?:\p{Ll}|\p{Nd}))(\p{Lu})#'];
        $replacement = [$separator . '\1', $separator . '\1'];
    } else {
        $pattern     = ['#(?<=(?:[A-Z]))([A-Z]+)([A-Z][a-z])#', '#(?<=(?:[a-z0-9]))([A-Z])#'];
        $replacement = ['\1' . $separator . '\2', $separator . '\1'];
    }
    return preg_replace($pattern, $replacement, $value);
}
function CamelCaseToUnderscore($value){
    return CamelCaseToSeparator($value,'_');
}
function CamelCaseToDash($value){
    return CamelCaseToSeparator($value,'-');
}
$string = CamelCaseToUnderscore("CamelCase");

1

এই কার্যকারিতা সরবরাহ করে একটি গ্রন্থাগার রয়েছে:

SnakeCaseFormatter::run('CamelCase'); // Output: "camel_case"

1
আমার মনে হয় আপনার অর্থ "আমি এই কার্যকারিতাটি সরবরাহ করে একটি গ্রন্থাগার তৈরি করেছি"। স্ব প্রচারে কোনও ভুল নেই, তবে এটি আড়াল করবেন না।
icc97


1

এটি একটি ছোট উপায়:

function camel_to_snake($input)
{
    return strtolower(ltrim(preg_replace('/([A-Z])/', '_\\1', $input), '_'));
}

কোড-কেবলমাত্র উত্তরগুলি স্ট্যাকওভারফ্লোতে স্বল্প মূল্য কারণ তারা হাজার হাজার ভবিষ্যত গবেষককে শিক্ষিত / ক্ষমতাবান করতে খুব কম কাজ করে।
মিকম্যাকুসা

1
@ মিকম্যাকুসা - হাজার হাজার ভবিষ্যত গবেষণাগুলি একজন এলিগ্যান্ট ওয়ান-লাইনারে আগ্রহী হবে এবং তাদেরকে শিক্ষিত করবে।
টেসন

আমি দুঃখিত যে আপনি সেই স্বার্থপর অবস্থান নিয়েছেন। আপনি যে স্পর্শকাতর উত্তরটি ডিজাইন করে টাইপ করেছেন তাতে আপনি অবশ্যই একটি ব্যাখ্যা যুক্ত করতে পারতেন। আপনার উত্তরটি তিনটি ফাংশন কল করে, তবে অন্যরা দুটিতে কার্য সম্পাদন করে।
মিকম্যাকুসা

1

রেজেেক্স ব্যবহার না করে কীভাবে ডি-ক্যামিটাইজ করবেন:

function decamelize($str, $glue = '_') {
    $capitals = [];
    $replace  = [];

    foreach(str_split($str) as $index => $char) {
        if(!ctype_upper($char)) {
            continue;
        }

        $capitals[] = $char;
        $replace[]  = ($index > 0 ? $glue : '') . strtolower($char);
    }

    if(count($capitals) > 0) {
        return str_replace($capitals, $replace, $str);
    }

    return $str;
}

একটি সম্পাদনা:

2019 এ আমি কীভাবে করব:

function toSnakeCase($str, $glue = '_') {
    return preg_replace_callback('/[A-Z]/', function ($matches) use ($glue) {
        return $glue . strtolower($matches[0]);
    }, $str);
}

এবং যখন পিএইচপি 7.4 প্রকাশিত হবে:

function toSnakeCase($str, $glue = '_') {
    return preg_replace_callback('/[A-Z]/', fn($matches) => $glue . strtolower($matches[0]), $str);
}

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

এটি উদাহরণস্বরূপ প্রকাশগুলি ব্যবহার না করে এটি কীভাবে করা যায়, এটি উত্পাদন ক্ষেত্রে কীভাবে ব্যবহার করা উচিত তা নয়, সুতরাং আমি আপনার বক্তব্যটি দেখতে পাচ্ছি না কারণ আপনি 5y / o উত্তর সম্পর্কে অভিযোগ করেছেন যার একটি উত্সাহ রয়েছে এবং এটি সম্ভবত দেখার সম্ভাবনা নেই যে কোনও গবেষক
টাকরা

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

0

জেন্ড ওয়ার্ড ফিল্টারগুলির ফিল্টার ক্লাসগুলি ব্যবহার করা সহজ :

<?php
namespace MyNamespace\Utility;

use Zend\Filter\Word\CamelCaseToUnderscore;
use Zend\Filter\Word\UnderscoreToCamelCase;

class String
{
    public function test()
    {
        $underscoredStrings = array(
            'simple_test',
            'easy',
            'html',
            'simple_xml',
            'pdf_load',
            'start_middle_last',
            'a_string',
            'some4_numbers234',
            'test123_string',
        );
        $camelCasedStrings = array(
            'simpleTest',
            'easy',
            'HTML',
            'simpleXML',
            'PDFLoad',
            'startMIDDLELast',
            'AString',
            'Some4Numbers234',
            'TEST123String',
        );
        echo PHP_EOL . '-----' . 'underscoreToCamelCase' . '-----' . PHP_EOL;
        foreach ($underscoredStrings as $rawString) {
            $filteredString = $this->underscoreToCamelCase($rawString);
            echo PHP_EOL . $rawString . ' >>> ' . $filteredString . PHP_EOL;
        }
        echo PHP_EOL . '-----' . 'camelCaseToUnderscore' . '-----' . PHP_EOL;
        foreach ($camelCasedStrings as $rawString) {
            $filteredString = $this->camelCaseToUnderscore($rawString);
            echo PHP_EOL . $rawString . ' >>> ' . $filteredString . PHP_EOL;
        }
    }

    public function camelCaseToUnderscore($input)
    {
        $camelCaseToSeparatorFilter = new CamelCaseToUnderscore();
        $result = $camelCaseToSeparatorFilter->filter($input);
        $result = strtolower($result);
        return $result;
    }

    public function underscoreToCamelCase($input)
    {
        $underscoreToCamelCaseFilter = new UnderscoreToCamelCase();
        $result = $underscoreToCamelCaseFilter->filter($input);
        return $result;
    }
}

----- underscoreToCamelCase -----

সরল_তম >>> সরলতম টেস্ট

সহজ >>> সহজ

এইচটিএমএল >>> এইচটিএমএল

সরল_এক্সএমএল >>> সিম্পল এক্সএমএল

পিডিএফ_লোড >>> পিডিএফলোড

স্টার্ট_মিজল_লাস্ট >>> স্টার্টমিডলস্ট

a_string >>> সংযুক্তি

some4_numbers234 >>> কিছু 4 নাম্বার 234

test123_string >>> টেস্ট 123 স্ট্রিং

----- camelCaseToUnderscore -----

সরলতম টেস্ট >>> সরল_তম test

সহজ >>> সহজ

এইচটিএমএল >>> এইচটিএমএল

সরল এক্সএমএল >>> সরল_ এক্সএমএল

পিডিএফ লোড >>> পিডিএফ_লোড

startMIDDLELast >>> start_middle_last

এস্ট্রিং >>> এ_স্ট্রিং

কিছু 4 নাম্বার 234 >>> কিছু 4_ সংখ্যা 234

TEST123 স্ট্রিং >>> টেস্ট 123_ স্ট্রিং


0

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

https://github.com/edertone/TurboCommons

এটি ব্যবহার করতে, আপনার প্রকল্পে ফার ফাইলটি আমদানি করুন এবং:

use org\turbocommons\src\main\php\utils\StringUtils;

echo StringUtils::formatCase('camelCase', StringUtils::FORMAT_SNAKE_CASE);

// will output 'camel_Case'

0
$str = 'FooBarBaz';

return strtolower(preg_replace('~(?<=\\w)([A-Z])~', '_$1', $str)); // foo_bar_baz

1
কোড-কেবলমাত্র উত্তরগুলি স্ট্যাকওভারফ্লোতে স্বল্প মূল্য কারণ তারা ভবিষ্যতের গবেষকদের ক্ষমতায়ন / শিক্ষিত করার একটি দুর্বল কাজ করে।
মিকম্যাকুসা

-1

যদি আপনি এটি দিয়ে শুরু করতে পারেন:

$string = 'Camel_Case'; // underscore or any other separator...

তারপরে আপনি এই দুটি ক্ষেত্রেই কেবল রূপান্তর করতে পারেন:

$pascal = str_replace("_", "", $string);
$snake = strtolower($string);

বা অন্য কোনও মামলা:

$capitalized = str_replace("_", " ", $string); // Camel Case
$constant = strtoupper($string);               // CAMEL_CASE
$train = str_replace("_", "-", $snake);        // camel-case
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.