独自の行にある場合にのみ用語を削除する


16

私はこれを持っています:

$text = '
   hello world
    
    hello
';

それが独自の行にある場合に  のみ削除するにどうすればよいですか?したがって、上記の例では、2番目 を削除する必要があります。結果は次のようになります。

$text = '
   hello world

    hello
';

これまでに試したこと

を介してstr_replace()、次のことができます。

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

ただし、これにより、それ自体の行にある場合だけでなく、のすべてのインスタンスが削除されます 


6
私がこれまでに試したことの美しい追加-このサイトでは標準的なはずです。+1
ゲイリーウッズ

2
@misorudeあなたのアプローチで回答を投稿してください。
Henrik Petterson

1
@OfirBaruch私は試しました$text = str_replace('\n'.' '.'\n', '', $text);が、うまくいきませんでした。を参照してください
Henrik Petterson

3
@FlashThunder str_replace()私の経験を判断する代わりにを使用して回答を投稿してみませんか。=)
Henrik Petterson

2
@misorudeしかし、サイト全体の問題だと感じた場合は、メタでコミュニティと話し合う必要があります。なぜここに押し込むのですか?
Henrik Petterson

回答:


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でコードを実行しようとしましたか?他の出力はありましたか?
Merianos Nikos

著者はその後にスペースについて他のコメントを求めていたので(そこには含まれていません)、タブ/いくつかのスペースがあることに気づいていないとも言えます。
Flash Thunder

@FlashThunder私は知っています。私はケースの例を求めていました。
Henrik Petterson

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
コードの出力は、要求されたものと同じではありません 。また、あなたの回答に反対票を投じたのは私ではないことに注意してください:)私のコメントはフレンドリーなメッセージ
でした

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

1
私はそれをテストし、動作しません:)。また、私はあなたに反対票を与えなかったことにも留意してください。これは、わかりやすいコメントです:)ソリューションをテストした後、出力は変更されません。
Merianos Nikos


1
それは私があなたのコードを実行したとき、私は私の地元で得るものです:pasteboard.co/IUkf2MK.png :)
Merianosニコス

2
@MerianosNikosおかしい、PHP5では動作しますが、PHP7では動作しません。
Flash Thunder

多分あなたは正しいです。私はそれを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;他のコンテンツが先行するa で終わる行も影響を受けるため、これはニーズを満たさない可能性があります。


1
私たちがこだわるなら、これは実際には非常に堅実な解決策ですstr_replace()
Henrik Petterson

それは...ですか?それが動作しないとき、私はより多くの例を見ることができます
フラッシュサンダー

@Progrockは、スペースのカウントがかかるように調整でき&nbsp;ますか?例:"&nbsp; \n"
Henrik Petterson

@HenrikPetterson no
Flash Thunder

1

DOTALLおよびMULTILINE修飾子とルックアラウンドアサーションを使用して、これに正規表現を使用できます。

preg_replace("~(?sm)(?<=\n)\s*&nbsp;(?=\n)~", '',$text);
  • (?sm):ドット(s)マルチライン(m)
  • (?<=\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;、a &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
"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.