टर्म तभी निकालें जब वह अपनी लाइन पर हो


16

मेरे पास यह है:

$text = '
   hello world
    
    hello
';

मैं इसे   केवल तभी हटा सकता हूं जब यह अपनी रेखा पर हो? इसलिए उपरोक्त उदाहरण के साथ, दूसरे  को हटा दिया जाना चाहिए। परिणाम होना चाहिए:

$text = '
   hello world

    hello
';

मैंने अब तक क्या कोशिश की है

वाया str_replace(), मैं कर सकता हूँ:

$text = str_replace(' ', '', $text);

लेकिन यह सभी उदाहरणों को हटा देगा  , न केवल तब जब यह अपनी लाइन पर हो।


6
मैंने अब तक जो भी प्रयास किया है उसका सुंदर जोड़ - इस साइट पर मानक होना चाहिए। +1
गैरी वुड्स

2
@misorude कृपया अपने दृष्टिकोण के साथ एक उत्तर पोस्ट करने के लिए स्वतंत्र महसूस करें।
हेनरिक पेटर्सन

1
@OfirBaruch मैंने कोशिश की $text = str_replace('\n'.' '.'\n', '', $text);लेकिन काम नहीं किया। देखते हैं
हेनरिक पेटर्सन

3
@FlashThunder आप str_replace()मेरे अनुभव को आंकने के बजाय उत्तर का उपयोग क्यों नहीं करते हैं । =)
हेनरिक पेटर्सन

2
@ माइसरूड लेकिन यह एक ऐसी चीज है जिस पर आपको लगता है कि यह एक साइट-व्यापी मुद्दा है। आप इसे यहां क्यों धकेल रहे हैं?
हेनरिक पेटर्सन

जवाबों:


10

मैंने पहले से ही इस दृष्टिकोण की कोशिश की है और मुझे वह आउटपुट मिलता है जो आप चाहते हैं

// Your initial text
$text = '
   hello world
    
    hello
';

// Explode the text on each new line and get an array with all lines of the text
$lines = explode("\n", $text);

// Iterrate over all the available lines
foreach($lines as $idx => $line) {
    // Here you are free to do any if statement you want, that helps to filter
    // your text.

    // Make sure that the text doesn't have any spaces before or after and 
    // check if the text in the given line is exactly the same is the  
    if ( ' ' === trim($line) ) {
        // If the text in the given line is   then replace this line 
        // with and emty character
        $lines[$idx] = str_replace(' ', '', $lines[$idx]);
    }
}

// Finally implode all the lines in a new text seperated by new lines.
echo implode("\n", $lines);

मेरे स्थानीय पर मेरा आउटपुट यह है:


hello world

 hello

यह व्हाट्सएप को भी हटा देगा, और लेखक केवल हटाना चाहता था 
फ्लैश थंडर

@FlashThunder मेरे पास आउटपुट के रूप में आउटपुट के साथ पूरी तरह से संरेखित है प्रश्न द्वारा अनुरोध किया गया है। यदि आप चेक करते हैं कि मेरा आउटपुट इनबिल्ट आवश्यकता के समान है :) तो क्या आपने PHP 7 में मेरा कोड चलाने की कोशिश की? क्या आपको कोई अन्य आउटपुट मिला?
मेरियानोस निकोस

मैं कहूंगा कि लेखक को यह भी पता नहीं है कि वहाँ एक टैब / कुछ रिक्त स्थान है, क्योंकि वह इसके बाद अंतरिक्ष के लिए अन्य टिप्पणी में पूछ रहा था (और इसमें यह शामिल नहीं है)।
फ्लैश थंडर

@FlashThunder मैं जागरूक हूं। मैं सिर्फ एक उदाहरण के लिए पूछ रहा था।
हेनरिक पेटर्सन

1
ओह सॉरी को मिसक्लिक बनना था
फ्लैश थंडर

2

मेरा दृष्टिकोण होगा:

  1. नई लाइनों पर पाठ को विस्फोट करें
  2. सरणी में प्रत्येक मान को ट्रिम करें
  3. प्रत्येक सरणी आइटम को मान से खाली करें  
  4. नई लाइनों के साथ इम्प्लोड

निम्नलिखित कोड में परिणाम:

$chunks = explode(PHP_EOL, $text);
$chunks = array_map('trim', $chunks);
foreach (array_keys($chunks, ' ') as $key) {
    $chunks[$key] = '';
}
$text = implode(PHP_EOL, $chunks);

2
आपके कोड का आउटपुट, जो पूछा गया है, उसके समान नहीं है: / `` `हैलो & nbsp; दुनिया & nbsp; हैलो` `` प्रारंभिक आवश्यकता केवल  खाली पाठ के साथ प्रतिस्थापित करने के लिए है , बिना पूरी लाइन के दूरस्थ: /। इसके अलावा, ध्यान रखें कि मुझे अपना जवाब नहीं दिया गया :) मेरी टिप्पणी सिर्फ एक
मैसेजिंग

1
ठीक है, मैंने इसे सुधारने के लिए अपना जवाब अपडेट किया
JanP

1
अब और बेहतर तरीके से :)
मेरियनोस निकोस

2

शायद कुछ इस तरह:

$text = preg_replace("~(^[\s]?|[\n\r][\s]?)( )([\s]?[\n\r|$])~s","$1$3",$text);

http://sandbox.onlinephpfunctions.com/code/f4192b95e0e41833b09598b6ec1258dca93c7f06

(यह PHP5 पर काम करता है , लेकिन किसी तरह PHP7 के कुछ संस्करणों पर काम नहीं करता है )


वैकल्पिक होगा:

<?php
    $lines = explode("\n",$text);
    foreach($lines as $n => $l)
        if(trim($l) == '&nbsp;')
            $lines[$n] = str_replace('&nbsp;','',$l);
    $text = implode("\n",$lines);
?>

1
मैं यह परीक्षण और काम नहीं करता है :)। यह भी ध्यान रखें कि मैंने आपको कोई डाउनवोट नहीं दिया। यह सिर्फ एक अनुकूल टिप्पणी है :) आपके समाधान का परीक्षण करने के बाद आउटपुट अपरिवर्तित रहता है।
मेरियानोस निकोस

@MerianosNikos यह कैसे नहीं करता है ?? sandbox.onlinephpfunctions.com/code/…
फ्लैश थंडर

1
जब मैं आपके कोड को चलाता हूं तो मुझे अपने स्थानीय में मिलता है: pasteboard.co/IUkf2MK.png :)
मेरियानोस निकोस

2
@MerianosNikos ओह मजेदार, PHP5 पर काम करता है, लेकिन PHP7 पर काम नहीं करता है।
फ्लैश थंडर

शायद आप सही हैं। मैं इसे php 7 पर चलाता हूं।
मेरियानोस निकोस

1

यदि आप लाइन चार्ट के अपने अंत को जानते हैं, और आपके &nbsp;द्वारा हमेशा एक नई लाइन का अनुसरण किया जाता है:

<?php
$text = '
   hello&nbsp;world
   &nbsp;
   &nbsp;hello
';


print str_replace("&nbsp;\n", "\n", $text);

आउटपुट (कुछ आंतरिक व्हाट्सएप प्रारूपण में खो गया है):

   hello&nbsp;world

   &nbsp;hello

कैविएट: कोई भी लाइन जो &nbsp;अन्य सामग्री के साथ समाप्त होती है, वह भी प्रभावित होगी, इसलिए यह आपकी आवश्यकताओं को पूरा नहीं कर सकती है।


1
अगर हम साथ रहें तो यह वास्तव में एक बहुत ही ठोस समाधान है str_replace()!
हेनरिक पेटर्सन

क्या यह? मैं अधिक मामलों को देख सकता हूं जब यह काम नहीं करेगा
फ्लैश थंडर

@ ड्रोग्रोक इसे एक तरह से समायोजित करना संभव है, जहां बाद में रिक्त स्थान के लिए गणना करता है &nbsp;? उदाहरण के लिए:"&nbsp; \n"
हेनरिक पीटरसन

@ हेनरिकपैटरसन नं
फ्लैश थंडर

1

आप इसके लिए एक नियमित अभिव्यक्ति का उपयोग कर सकते हैं, DOTALL और MULTILINE संशोधक को एक साथ लुक-अराउंड के साथ प्रयोग कर सकते हैं:

preg_replace("~(?sm)(?<=\n)\s*&nbsp;(?=\n)~", '',$text);
  • (?sm): DOTALL (s) MULTILINE (m)
  • (?<=\n): पूर्ववर्ती नई रेखा (मैच का हिस्सा नहीं)
  • \s*&nbsp;\s*: एकल & nbsp; वैकल्पिक आसपास के व्हाट्सएप के साथ
  • (?=\n): अनुगामी newline (मैच का हिस्सा नहीं)
>>> $text = '                                                                                               
 hello&nbsp;world                                                                                         
 &nbsp;                                                                                                   
 &nbsp;hello                                                                                           
 ';
=> """
   \n
      hello&nbsp;world\n
      &nbsp;\n
      &nbsp;hello\n
   """
>>> preg_replace("~(?sm)(?<=\n)\s*&nbsp;\s*(?=\n)~", '',$text);
=> """
   \n
      hello&nbsp;world\n
   \n
      &nbsp;hello\n
   """
>>>

0

आप लाइनों में विभाजित कर सकते हैं, फिर लाइनों &nbsp;पर खाली स्ट्रिंग के लिए स्थानापन्न करें जिसमें केवल एक &nbsp;और व्हाट्सएप हो।

हम उन्हें कैप्चर करके, मूल पंक्ति के अंत को रखेंगे।

<?php

$text = '
   hello&nbsp;world
   &nbsp;
   &nbsp;hello
';
$lines = preg_split('@(\R)@', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
foreach($lines as &$v)
    if (trim($v) === '&nbsp;')
        $v = str_replace('&nbsp;', '', $v);

$result = implode($lines);
var_dump($result);

आउटपुट:

string(40) "
   hello&nbsp;world

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