Видаліть термін, лише якщо він знаходиться в його власному рядку


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
@misorude Але це щось, що вам потрібно буде обговорити з спільнотою в мета, якщо ви вважаєте, що це проблема, пов’язана з сайтом. Чому ти її тиснеш сюди?
Генрік Петтерсон

Відповіді:


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

це також видалить пробіли, і автор хотів видалити лише 
Flash Thunder

@FlashThunder те, що я маю як результат, повністю узгоджується з результатами, запитаним запитанням. Якщо ви перевіряєте, чи мої вихідні дані ідентичні вимогам :) Чи намагалися ви запустити мій код у PHP 7? У вас був інший вихід?
Меріанос Нікос

Я б сказав, що автор навіть не знає, що там є вкладка / мало пробілів, як він просив в іншому коментарі про простір після нього (і він не містить цього).
Спалах Грім

@FlashThunder Я знаю. Я просто просив приклад справи.
Генрік Петтерсон

1
о, вибачте, мав бути помилковий клік
Flash Thunder

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
Вихід вашого коду не ідентичний тому, що запитується: / `` `hello & nbsp; world & nbsp; hello` `` Початкова вимога полягає лише в тому, щоб замінити  порожній текст, не віддаляючи весь рядок: /. Крім того, пам’ятайте, що я не сприйняв вашу відповідь :) Мій коментар був просто дружнім повідомленням :)
Merianos Nikos

1
Гаразд, я оновив свою відповідь, щоб виправити це
січня

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/…
Flash Thunder

1
Це те, що я отримую в моєму місцевому , коли я запускаю код: pasteboard.co/IUkf2MK.png :)
Merianos Нікос

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

Caveat: Будь-який рядок, який закінчується &nbsp;іншим вмістом, що передує, також може вплинути, тому це може не відповідати вашим потребам.


1
Це насправді дуже солідне рішення, якщо ми будемо дотримуватися str_replace()!
Генрік Петтерсон

є це? Я бачу більше випадків, коли це не спрацювало
Flash Thunder

@Progrock чи можна відрегулювати його таким чином, коли після цього потрібно рахувати пробіли &nbsp;? Наприклад:"&nbsp; \n"
Генрік Петтерсон

@HenrikPetterson ні
Flash Thunder

1

Ви можете використовувати регулярний вираз для цього, використовуючи модифікатори DOTALL і MULTILINE разом із твердженнями навколо.

preg_replace("~(?sm)(?<=\n)\s*&nbsp;(?=\n)~", '',$text);
  • (?sm): DOTALL (s) MULTILINE (м)
  • (?<=\n): перед новим рядком (не є частиною матчу)
  • \s*&nbsp;\s*: одномісний & nbsp; з необов’язковим оточуючим пробілом
  • (?=\n): трейлінг нового рядка (не частина матчу)
>>> $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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.