Удалить термин, только если он находится на своей линии

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 Но это то, что вам нужно обсудить с сообществом в meta, если вы чувствуете, что это проблема всего сайта. Почему ты толкаешь это здесь?
Хенрик Петтерсон

Ответы:

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? У вас есть какой-нибудь другой выход?
Мерианос Никос
Я бы сказал, что автор даже не знает, что там есть табуляция / несколько пробелов, поскольку он просил в другом комментарии пробел после него (и он не содержит этого).
Flash Thunder
@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);
JanP
источник
2
Вывод вашего кода не идентичен тому, что запрашивается: / `` `hello & nbsp; world & nbsp; hello` `` Первоначальное требование - заменить только  пустой текст без удаленной всей строки: /. Кроме того, имейте в виду, что не я понизил ваш ответ :) Мой комментарий был просто дружеским сообщением :)
Merianos Nikos
1
Хорошо, я обновил свой ответ, чтобы исправить это
JanP
1
Теперь намного лучше :)
Merianos Nikos
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);
?>
Flash Thunder
источник
1
Я проверяю это и не работает :). Также имейте в виду, я не дал вам никаких отрицательных голосов. Это просто дружеский комментарий :) Результат остается неизменным после тестирования вашего решения.
Мерианос Никос
@MerianosNikos как не так ?? sandbox.onlinephpfunctions.com/code/…
Flash Thunder
1
Это то, что я получаю в моем местном , когда я запускаю код: pasteboard.co/IUkf2MK.png :)
Merianos Никос
2
@MerianosNikos о, забавно, работает на PHP5, но не работает на PHP7.
Flash Thunder
Может быть ты прав. Я запускаю его на php 7.
Merianos Nikos
1

Если вы знаете свой конец строки символов и ваши &nbsp; всегда следует новая строка:

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


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

Вывод (некоторые начальные пробелы здесь теряются при форматировании):

   hello&nbsp;world

   &nbsp;hello

Предупреждение: любая строка, которая заканчивается &nbsp;предшествующим другим содержимым, также будет затронута, поэтому это может не соответствовать вашим потребностям.

Progrock
источник
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
"
Progrock
источник