PHP समापन टैग को टिप्पणी में बदलें


149

मेरी स्क्रिप्ट की एक पंक्तियों में एक स्ट्रिंग के अंदर PHP समापन टैग शामिल है। सामान्य ऑपरेशन के तहत यह एक समस्या का कारण नहीं बनता है, लेकिन मुझे लाइन पर टिप्पणी करने की आवश्यकता है।

मैं के साथ इस लाइन बाहर टिप्पणी करने की कोशिश की है //, /* */और #, लेकिन उनमें से कोई कार्य नहीं, पार्सर टैग को बंद करने पर विचार एक वास्तविक बंद टैग किया जाना है।

यहाँ प्रश्न में पंक्ति है:

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

उपरोक्त पंक्ति के बारे में टिप्पणी करने के लिए मैं क्या कर सकता हूं?


18
मजेदार समस्या है, लेकिन वास्तविक है। मैं वोट देता हूं।
वोइटस्कस

17
हे भगवान। पहले तो मुझे आपके सवाल पर संदेह हुआ, यह पूछने के लिए तैयार था कि समस्या क्या है, लेकिन फिर मैंने एक स्ट्रिंग युक्त लाइन पर टिप्पणी करने की कोशिश की जिसमें '>>' और मुझे मिल गया। इसे phpsadness.com
lolesque

6
ऐसे "फ़ीचर" की उपयोगिता php.net/manual/en/language.basic-syntax.comments.php में बताई गई है , यह वन-लाइनर के मामले में उपयोगी है <?php # echo 'simple';?>
११:

2
@lolesque उस लिंक के लिए धन्यवाद। एक अच्छी पहल। एक संबंधित जो अन्य भाषाओं को भी शामिल करता है: wiki.theory.org/YourLanguageSucks
सिमोन फोर्सबर्ग

5
@ Ondra repeatedižka सब वह कर रहा है दोहराया टैग हटा रहा है। एक regex उस के लिए ठीक काम करता है। सिर्फ इसलिए कि यह बुरा है कभी-कभी इसका मतलब यह नहीं है कि यह हर समय खराब है।
किप

जवाबों:


124

एक चाल का उपयोग करें: दो टुकड़ों से स्ट्रिंग को समतल करें। इस तरह, समापन टैग दो में कट जाता है, और अब एक वैध समापन टैग नहीं है।'?>' --> '?'.'>'

आपके कोड में:

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

यह //टिप्पणियों को काम देगा।

/* */काम करने के लिए टिप्पणियों के लिए, आपको */अनुक्रम भी विभाजित करना होगा :

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

याद रखें, कभी-कभी, भले ही पूरे उसके हिस्सों की राशि से अधिक हो - लेकिन लालची होना बुरा है, ऐसे समय होते हैं जब आप कम के साथ बेहतर होते हैं । :)


@ppeterka वाह, मैंने उस बारे में सोचा भी नहीं था। धन्यवाद।
v1n_vampire

1
मुझे इस ट्रिक का उपयोग C 2 दिनों पहले एक स्ट्रिंग युक्त करने के लिए करना था??<
Ryan Amos

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);
                               ^  ^             ^  ^

@Cthulhu +1 (और उत्तर के लिए भी, बिल्कुल)। इसके अलावा (कम से कम मेरे लिए) यह समझने के लिए regexp को थोड़ा मुश्किल बनाता है। बहुत ज्यादा नहीं, लेकिन अगर मैंने इस रेगेक्स को देखा, तो मैं कहूंगा: हम्म, क्या चल रहा है? लेकिन यह सर्वथा और पूरी तरह से व्यक्तिपरक है।
पपेटरका

1
@ppeterka मैं कुछ हद तक सहमत हूँ, इसलिए मुझे xसंशोधक का उपयोग करके एक और तरीका मिला :)
Jakack

@ जेक नाइस, मैं इसके लिए एक और +1 दूंगा, मैंने कुछ नया सीखा है ... मैं रेगेक्स मॉडिफायर के बारे में g
भूलता रहता

@ जैक धन्यवाद, मैं समाधान से रेगेक्स के बारे में नई चीजें सीखता हूं।
v1n_vampire

1
+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',...
                                    ^ ^              ^ ^

आगे की...

उपरोक्त के बाद, आपको /*लाइन पर टिप्पणी करने के लिए उपयोग करने में सक्षम होना चाहिए । यदि आप ?>अक्षत छोड़ते हैं , //तो संभवत: एक पूरी लाइन पर टिप्पणी नहीं कर सकते। निम्नलिखित पाठ ?>html हो सकता है, जो PHP दुभाषिया के नियंत्रण से बाहर है , इसलिए यह काम नहीं करेगा।

से प्रलेखन:

"वन-लाइन" टिप्पणी शैली केवल लाइन के अंत या PHP कोड के वर्तमान ब्लॉक पर टिप्पणी करती है, जो भी पहले आती है। इसका अर्थ है कि // ...?> या # ...? के बाद HTML कोड मुद्रित किया जाएगा:> PHP मोड से बाहर निकलता है और HTML मोड में लौटता है, और / या # उसे प्रभावित नहीं कर सकता है।


धन्यवाद, इतनी सारी चीजें मुझे अभी भी नहीं पता ... यह मददगार है।
v1n_vampire

4
इस पोस्ट को और अधिक + 1s के लायक होगा ... पूरी तरह से अकेले स्पष्टीकरण के लिए।
पपेटरका

15

एक और विचार: पलायन >(और /, यदि आप एक /*...*/टिप्पणी का उपयोग करना चाहते हैं ):

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

रेगेक्स इंजन द्वारा "अनावश्यक" पलायन को अनदेखा किया जाता है, लेकिन इस मामले में उपयोगी है (अन्य उत्तरों में उल्लिखित कारणों के लिए)।


@ppeterka: मैंने एक चरित्र वर्ग के बजाय एक बैकस्लैश का उपयोग किया (लेकिन हाँ, मुझे एक घटना याद आती है। धन्यवाद!)
टिम पीत्ज़ेकर

क्षमा करें, ऐसा लगता है कि मैं थक गया हूं ... मैंने दूसरे पर ध्यान दिया, जो वहां से घिरा हुआ था [] ...
ppeterka

10

समस्या के चारों ओर काम करने के लिए "ट्रिक्स" पढ़ने के लिए जटिल, कठिन क्यों उपयोग करें?

? सुविधा के लिए सिर्फ एक क्वांटिफायर शॉर्टकट है, इसलिए

बस क्वांटिफायर के लंबे संस्करण का उपयोग करें{0,1} , जिसका अर्थ है "न्यूनतम 0 अधिकतम 1 घटना":

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

1
+1 यह पेज हमारे दिमाग के पीछे रखने के लिए रेगेक्स ट्रिक्स इकट्ठा करने के लिए एक बहुत अच्छी जगह है।
पपेटरका '

1
@ppeterka, मैं वास्तव में अन्य सभी उत्तरों को "ट्रिक्स" कहूंगा, लेकिन मेरा जवाब सिर्फ क्वांटिफायर के लंबे संस्करण का उपयोग करना है न कि शॉर्टकट का।
स्टैमा

3
कोई अपराध नहीं, बस मेरे शब्दकोष में, छोटे के बजाय एक अभिव्यक्ति के लंबे संस्करण का उपयोग करते हुए, अधिक सुविधाजनक वाक्यविन्यास चीनी एक चाल के रूप में भी गिना जाता है ...
ppeterka

8

RegEx ट्रिक बुक में जोड़ने के लायक कुछ अन्य तरीके :

पहले आप अपने RegEx को संकुचित कर सकते हैं: /(<br\s*/?>)+/iऔर उसके साथ बदलें <br />(RegExP को लुकहीड्स के साथ बोझ करने की आवश्यकता नहीं है) और आप हमेशा अपने चुने हुए XHMTL लाइन ब्रेक के साथ समाप्त होंगे।

अपने RegEx को संशोधित करने के अन्य तरीके ताकि यह */अंत टिप्पणी या ?>अंत स्क्रिप्ट की यात्रा न करे :

  • प्रॉपर्टीज क्वांटिफायर का उपयोग करें : #(<br\s*+/?+>)+#i- जो मूल रूप से \s*+आपके लिए व्हाट्सएप मैच के रूप में कई के रूप में मतलब है कि वहाँ रहे हैं और इसे रखने के लिए, और /?+अगर आप एक स्लैश पाया यह रखने के लिए!
  • संलग्न करें \s*और /*कैप्चर समूहों में =>#(<br(\s*)(/?)>)+#i

लाइव डेमो: http://codepad.viper-7.com/YjqUbi

और जब से हमने अधिकारपूर्ण व्यवहार को तेजी से झुकाया है सबसे तेज RegEx जो कि टिप्पणी की समस्या को भी दरकिनार करता है: समझाया गया डेमो है#(<br\s*+/?+>)++#i


के रूप में मुश्किल स्थितियों में टिप्पणी करने के लिए

जब आप कोड को बदल नहीं सकते हैं, या पहले से ही एक बहुस्तरीय टिप्पणी का उपयोग किया है और:

1. एक nowdoc का उपयोग करें :

    $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 एक के समान है हियरडॉक लेकिन यह सामग्री पार्स नहीं करता है और यह होनी है प्रारंभ सीमांकक में संलग्न 'एकल उद्धरण '( ध्यान दें कि न खत्म होने वाली सीमांकक 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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.