পিএইচপি ক্লোজিং ট্যাগটিকে মন্তব্যে রূপান্তর করুন


149

আমার স্ক্রিপ্টের একটি লাইন একটি স্ট্রিংয়ের ভিতরে পিএইচপি ক্লোজিং ট্যাগ ধারণ করে। স্বাভাবিক অপারেশনের অধীনে এটি কোনও সমস্যা সৃষ্টি করে না তবে আমার লাইনটি মন্তব্য করা দরকার।

আমি এই লাইনের সাথে মন্তব্য করার চেষ্টা করেছি //, /* */এবং #তাদের মধ্যে কেউই কাজ করে না, পার্সার ক্লোজিং ট্যাগটিকে একটি প্রকৃত সমাধিকারী ট্যাগ হিসাবে বিবেচনা করে।

প্রশ্নে লাইনটি এখানে:

$string = preg_replace('#<br\s*/?>(?:\s*<br\s*/?>)+#i', '<br />', $string);
//                              ^^             ^^

উপরের লাইনটি মন্তব্য করার জন্য আমি কী করতে পারি?


18
মজার সমস্যা, কিন্তু বাস্তব। আমি ভোট দিয়েছি
ভাইটস

17
ঈশ্বর. প্রথমে আমি আপনার প্রশ্ন সম্পর্কে সংশয়ী ছিলাম, সমস্যাটি কি তা জিজ্ঞাসা করতে প্রস্তুত, তবে তারপরে আমি '?>' যুক্ত স্ট্রিংয়ের সাথে একটি লাইনে মন্তব্য করার চেষ্টা করেছি এবং এটি পেয়েছি। এটি phpsadness.com-
ললস্কে

6
এই জাতীয় "বৈশিষ্ট্য" এর কার্যকারিতা php.net/manual/en/language.basic-syntax.comments.php এ ব্যাখ্যা করা হয়েছে , ওয়ান-লাইনারের ক্ষেত্রে এটি দরকারী <?php # echo 'simple';?>
lolesque

2
এই লিঙ্কটির জন্য ধন্যবাদ একটি ভাল। সম্পর্কিত সম্পর্কিত যা অন্যান্য ভাষাগুলিও অন্তর্ভুক্ত করে: wiki.theory.org/YourLanguageSks
সাইমন ফোরসবার্গ

5
@ ওন্দ্রাŽইকা তিনি যা করছেন তা বার বার বিআর ট্যাগগুলি মুছে ফেলা হচ্ছে। একটি রেজেক্স তার জন্য ভাল কাজ করে। এটি কখনও কখনও খারাপ হওয়ার অর্থ এটি সর্বদা খারাপ হয় না।
কিপ

উত্তর:


124

একটি কৌশল ব্যবহার করুন: দুটি টুকরো থেকে স্ট্রিং সংযুক্ত করুন। এইভাবে, সমাপ্তি ট্যাগটি দুটি কেটে দেওয়া হয় এবং এটি আর বৈধ ক্লোজিং ট্যাগ নয়।'?>' --> '?'.'>'

আপনার কোডে:

$string = preg_replace('#<br\s*/?'.'>(?:\s*<br\s*/?'.'>)+#i', '<br />', $string);

এটি //মন্তব্যগুলিকে কাজ করবে।

জন্য /* */কাজ মন্তব্য, আপনি বিভক্ত করতে চাই */ক্রম খুব:

$string = preg_replace('#<br\s*'.'/?'.'>(?:\s*<br\s*'.'/?'.'>)+#i', '<br />', $string);

মনে রাখবেন, কখনো কখনো, যদিও পুরো হয় আরো তার অংশের যোগফল চেয়ে - কিন্তু লোভী হচ্ছে খারাপ, এমন সময় আপনি ভাল অবশিষ্ট হয় কম । :)


@ পিপেরকা বাহ, আমি সে সম্পর্কে ভাবিনি। ধন্যবাদ.
v1n_vampire

1
আমাকে 2 দিন আগে সিটিতে এই কৌশলটি ব্যবহার করতে হয়েছিল স্ট্রিংয়ের জন্য??<
রায়ান আমোস

2
ভাল একটা. কেন আমি কখনই সেভাবে ভাবি না !?
সান

73

সহজতম পথ

আপনার নিয়মিত অভিব্যক্তি ধরে রাখতে একটি পৃথক ভেরিয়েবল তৈরি করুন; এইভাবে আপনি preg_replace()বিবৃতিটি সহজভাবে মন্তব্য করতে পারেন :

$re = '#<br\s*/?>(?:\s*<br\s*/?>)+#i';
// $string = preg_replace($re, '<br />', $string);

চরিত্রের ক্লাস ব্যবহার করে ঠিক করুন

লাইন মন্তব্যগুলি ঠিক করতে, আপনি এর মতো একটি অক্ষর শ্রেণীর ভিতরে ?>রেখে ব্রেক আপ করতে >পারেন:

$string = preg_replace('#<br\s*/?[>](?:\s*<br\s*/?[>])+#i', '<br />', $string);
                                 ^ ^              ^ ^

ব্লক মন্তব্যগুলি ঠিক করতে, আপনি এটি প্রয়োগ করতে পারেন /:

$string = preg_replace('#<br\s*[/]?>(?:\s*<br\s*[/]?>)+#i', '<br />', $string);
                               ^ ^              ^ ^

উভয় মন্তব্য শৈলী সমাধানের জন্য, আপনি লাগাতে পারেন / এবং > তাদের নিজস্ব চরিত্র ক্লাসে।

/xসংশোধক ব্যবহার করে ঠিক করুন

x পরিবর্তক - ওরফে PCRE_EXTENDED- অগ্রাহ্যের তালিকা স্পেস এবং একটি রেগুলার এক্সপ্রেশন (যখন তারা একটি অক্ষর শ্রেণীর ভিতরের ঘটতে ব্যতীত) মধ্যে নতুন লাইন; এটি সমস্যাযুক্ত চরিত্রগুলি পৃথক করার জন্য স্পেস যুক্ত করা সম্ভব করে তোলে। উভয় মন্তব্য শৈলী ঠিক করতে:

$string = preg_replace('#<br\s* /? >(?:\s*<br\s* /? >)+#ix', '<br />', $string);
                               ^  ^             ^  ^

@ চথুলহু +1 (এবং অবশ্যই উত্তরটির জন্য)। এছাড়াও (কমপক্ষে আমার জন্য) এটি রিজেক্সটকে বুঝতে কিছুটা শক্ত করে তোলে। খুব বেশি কিছু নয়, তবে আমি যদি এই রেজেক্সটি দেখি, আমি বলব: হুমম, কী হচ্ছে? তবে তা নিখরচায় এবং সম্পূর্ণ বিষয়গত।
ppeterka

1
@ পিপেরকা আমি কিছুটা হলেও একমত, তাই আমি আরেকটি উপায় খুঁজে পেলাম, x
সংশোধকটি

@ জ্যাক নিস, আমি এর জন্য আরও একটি +1 দিয়েছি, আমি নতুন কিছু শিখেছি ... আমি রেগেক্স সংশোধনকারীদের সম্পর্কে ভুলে যেতে থাকি (আমি খুব কমই এগুলি ব্যবহার করি g) ...
পেপেরকা

@ জ্যাক আপনাকে ধন্যবাদ, আমি সমাধান থেকে রেইগেক্স সম্পর্কে নতুন জিনিস শিখি।
v1n_vampire

1
পূর্ববর্তী লাইনে রেজেক্সকে আলাদা করার জন্য +1। এটি রেজেক্সকে একই রাখে, তবে তবুও যুক্তিকে মন্তব্য করার সুযোগ দেয়।

38

আপনার প্রচেষ্টা কেন কার্যকর হয়নি:

// $string = preg_replace('#<br\s*/?>(?:\s*<br\s*/?>)+#i',...
                                   ^ doesn't work due to ?> ending php

/* $string = preg_replace('#<br\s*/?>(?:\s*<br\s*/?>)+#i',... */
                                 ^ doesn't work due to */ closing comment

কি কাজ:

/* $string = preg_replace('#<br\s*[/]?>(?:\s*<br\s*[/]?>)+#i',... */
                                  ^ ^              ^ ^
// $string = preg_replace('#<br\s*/?[>](?:\s*<br\s*/?[>])+#i',...
                                    ^ ^              ^ ^

আরও ...

উপরের পরে, আপনি /*লাইনটি মন্তব্য করতে সক্ষম হবেন । আপনি যদি ?>অক্ষতটি ছেড়ে যান, তবে //সম্ভবত একটি সম্পূর্ণ লাইন সম্পর্কে মন্তব্য করতে পারবেন না। নিম্নলিখিত পাঠ্যটি ?>এইচটিএমএল হতে পারে, যা পিএইচপি ইন্টারপ্রেটারের নিয়ন্ত্রণের বাইরে , যাতে এটি কাজ করে না।

ডকুমেন্টেশন থেকে :

"এক-লাইন" মন্তব্য শৈলীগুলি কেবল লাইনের শেষে বা পিএইচপি কোডের বর্তমান ব্লকটিতে মন্তব্য করে, যেটি প্রথমে আসে। এর অর্থ হল যে .... ...?> বা # ...?> এর পরে এইচটিএমএল কোডটি কি মুদ্রিত হবে:?> পিএইচপি মোডের বাইরে চলে যায় এবং এইচটিএমএল মোডে ফিরে আসে, এবং // বা # এটি প্রভাবিত করতে পারে না।


আপনাকে ধন্যবাদ, অনেক কিছুই আমি এখনও জানি না ... এটি সহায়ক।
v1n_vampire 5'13

4
এই পোস্টটি আরও বেশি +1 প্রাপ্য হবে ... সম্পূর্ণরূপে ব্যাখ্যা করার জন্য।
পেপেটারকা

15

আরেকটি ধারণা: >(এবং /আপনি যদি কোনও /*...*/মন্তব্য ব্যবহার করতে চান ) থেকে পালান :

$string = preg_replace('#<br\s*\/?\>(?:\s*<br\s*\/?\>)+#i', '<br />', $string);

রেজেক্স ইঞ্জিন দ্বারা একটি "অপ্রয়োজনীয়" পালানো উপেক্ষা করা হয়, তবে এই ক্ষেত্রে (অন্যান্য উত্তরে বর্ণিত কারণে) দরকারী is


@ পিপেরকা: আমি একটি চরিত্রের ক্লাসের পরিবর্তে ব্যাকস্ল্যাশ ব্যবহার করেছি (তবে হ্যাঁ, আমি একটি ঘটনা অনুভব করতে পারি নি। ধন্যবাদ!)
টিম পিটজেকার

দুঃখিত, মনে হচ্ছে আমি ক্লান্ত হয়ে পড়েছি ... আমি দ্বিতীয়টিকে লক্ষ্য করেছিলাম, যা সেখানেই ছিল [] ...
পেপেরকা

10

সমস্যাটি কেন কাজ করতে জটিল, "কৌশল" পড়া কঠিন?

? সুবিধার জন্য কেবল একটি কোয়ান্টিফায়ার শর্টকাট, তাই

কোয়ানটিফায়ারের দীর্ঘ সংস্করণটি কেবল ব্যবহার করুন{0,1} , এর অর্থ "সর্বনিম্ন 0 সর্বোচ্চ 1 টি ঘটনা":

$string = preg_replace('#<br\s*/{0,1}>(?:\s*<br\s*/{0,1}>)+#i', '<br />', $string);

1
+1 এই পৃষ্ঠাটি আমাদের মনের পিছনে রাখার জন্য রেগেক্স কৌশলগুলি সংগ্রহের জন্য খুব ভাল জায়গা হতে শুরু করে।
পেপেরকা

1
@ পেপেরকা, আমি আসলে অন্য সমস্ত উত্তরকে "কৌশল" বলব, তবে আমার উত্তরটি শর্টকাট নয়, কোয়ান্টিফায়ারের দীর্ঘ সংস্করণ ব্যবহার করছে।
স্টিমা

3
কোনও অপরাধ নয়, কেবলমাত্র আমার অভিধানে, সংক্ষিপ্ত পরিবর্তে অভিব্যক্তির দীর্ঘ সংস্করণ ব্যবহার করে, আরও সুবিধাজনক সিনট্যাকটিক
চিনিও

8

রেজিএক্স ট্রিক বইতে যুক্ত করার মতো আরও কয়েকটি উপায় :

প্রথমে আপনি আপনার RegEx এর সাথে সংযোগ করতে পারেন: /(<br\s*/?>)+/iএবং এর সাথে প্রতিস্থাপন করুন <br />(চেহারাগুলির সাথে RegExP বোঝা লাগবে না) এবং আপনি সর্বদা আপনার নির্বাচিত এক্সএইচএমটিএল লাইন ব্রেকটি শেষ করবেন।

আপনার RegEx সংশোধন করার অন্যান্য উপায় যাতে এটি */শেষ মন্তব্য বা ?>শেষ স্ক্রিপ্টে ভ্রমণ না করে :

  • প্রাইভেট কোয়ান্টিফায়ার ব্যবহার করুন : #(<br\s*+/?+>)+#i- মূলত এর অর্থ \s*+হ'ল যদি আপনি হোয়াইটস্পেসের সাথে মিল রয়েছে এবং এটি রাখছেন, এবং /?+যদি স্ল্যাশ পেয়ে থাকেন তবে এটি রাখুন!
  • সংযুক্ত \s*এবং /*ক্যাপচার গ্রুপগুলিতে =>#(<br(\s*)(/?)>)+#i

লাইভ ডেমো: http://codepad.viper-7.com/YjqUbi

এবং যেহেতু আমরা অধিকারী আচরণকে ঝুঁকে ফেলেছি দ্রুততম RegEx যা মন্তব্য করার সমস্যাটিকেও বাদ দেয়: ব্যাখ্যা করা ডেমো#(<br\s*+/?+>)++#i


কৌশলপূর্ণ পরিস্থিতিতে মন্তব্য করার জন্য

আপনি যখন কোডটি পরিবর্তন করতে পারবেন না, বা ইতিমধ্যে একটি মাল্টলাইন মন্তব্য ব্যবহার করেছেন এবং:

1. একটি নওডোক ব্যবহার করুন :

    $string='Hello<br>World<br><br />World<br><br><br>Word!';
    <<<'comment'
    $string = preg_replace('#(<br\s*/?>)+#i', '<br />', $string);
comment;

লাইভ কোড: http://codepad.viper-7.com/22uOtV

নোট: একটি nowdoc একটি অনুরূপ heredoc কিন্তু এটা বিষয়বস্তু বিশ্লেষণ না এবং এটা হচ্ছে আছে আছে শুরু বিভেদক মধ্যে লেখা 'একক উদ্ধৃতি '( দয়া করে মনে রাখবেন বিভক্তি বিভেদক idented করা যাবে না , দ্বারা অনুসরণ করা আবশ্যক ;এবং একটি নতুন লাইন ! )

2. একটি গোটো সহ কোডের উপরে ঝাঁপুন :

$string='Hello<br>World<br><br />World<br><br><br>Word!';
goto landing;
$string = preg_replace('#(<br\s*/?>)+#i', '<br />', $string);
landing:

সরাসরি উদাহরণ: http://codepad.viper-7.com/UfqrIQ

3. মাধ্যমে কোডের উপর তিড়িং লাফ if(false)বা if(0):

$string='Hello<br>World<br><br />World<br><br><br>Word!';
if(0){
$string = preg_replace('#(<br\s*/?>)+#i', '<br />', $string);
}

পরীক্ষা: http://codepad.viper-7.com/wDg5H5

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