Удалить термин, только если он находится на своей линии - PullRequest
16 голосов
/ 12 февраля 2020

У меня есть это:

$text = '
   hello world
    
    hello
';

Как мне удалить   только , если он находится на отдельной линии? Таким образом, в приведенном выше примере, второй   должен быть удален. Результаты должны быть:

$text = '
   hello world

    hello
';

То, что я пробовал до сих пор

Через str_replace(), я могу:

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

Но это удалит все экземпляров  , не только когда он находится на отдельной линии.

Ответы [ 6 ]

10 голосов
/ 12 февраля 2020

Я уже пробовал этот подход, и я получаю вывод, который вы хотите

// 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
2 голосов
/ 12 февраля 2020

Может быть что-то вроде этого:

$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);
?>
2 голосов
/ 12 февраля 2020

Мой подход будет следующим:

  1. Разбить текст на новые строки
  2. Обрезать каждое значение в массиве
  3. Очистить каждый элемент массива со значением &nbsp;
  4. взорваться новыми строками

В результате следующий код:

$chunks = explode(PHP_EOL, $text);
$chunks = array_map('trim', $chunks);
foreach (array_keys($chunks, '&nbsp;') as $key) {
    $chunks[$key] = '';
}
$text = implode(PHP_EOL, $chunks);
1 голос
/ 12 февраля 2020

Для этого можно использовать регулярное выражение, используя модификаторы DOTALL и MULTILINE вместе с проверочными утверждениями:

preg_replace("~(?sm)(?<=\n)\s*&nbsp;(?=\n)~", '',$text);
  • (?sm): DOTALL (s) MULTILINE (m)
  • (?<=\n): предшествующий символ новой строки (не является частью совпадения)
  • \s*&nbsp;\s*: одиночный с необязательным окружающим пробелом
  • (?=\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
   """
>>>
1 голос
/ 12 февраля 2020

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

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


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

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

   hello&nbsp;world

   &nbsp;hello

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

0 голосов
/ 12 февраля 2020

Вы можете разбить на строки, а затем заменить &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
"
...