2017-02-04 6 views
2

mを使用するphp function複数行の文字列から不要な空白をすべて削除する関数を作成したいとします。複数行の文字列にregexを使用して空白と空白を整えます

それは働いていない正規表現は、最後にスペースを削除いずれかになります。

// Always trim at the end. Warning: this seems to be the costlier 
// operation, perhaps because looking ahead is harder? 
$patterns[] = ['/ +$/m', '']; 

はテキストエリアから次の文字列を考える:

first line... abc //<-- blank space here 
second is here... def //<-- blank space here 
//<-- blank space here 
fourth line... hi there //<-- blank space here 

sith is here.... //<-- blank space here 

を先頭に空白があると各行の終わりに単語の間に複数の行が加えられます。私は、関数を実行した後

$functions->trimWhitespace($description, ['blankLines' => false]); 

これは私が得るものです:

first line... abc //<-- blank space here 
second is here... def //<-- blank space here 
//<-- no bank space here 
fourth line... hi there //<-- blank space here 

sith is here....//<-- no blank space here 
なぜそれが唯一の最後の行から末尾のスペースを削除して

+0

使用する改行の種類についてわからない場合は、[''/ + \ r?$/m''](https://eval.in/730414)を試してください。 –

+0

それはPHPなので、 ''/ \ h + $/um''を使わないでください。 –

+0

@bobblebubble Yay!それが欠けていたものです。私は現在Linuxに入っていますが、WindowsとMacで動作するかどうかはわかりません。解決策を回答に入れてください。ありがとう。 –

答えて

2

あなたが再定義することがあります。私たちはこのように、gせずに正規表現を使用しpreg_match_all

preg_matchを交換する必要があります。

PHP demoを参照してください:

$s = " ddd \r\n bbb  "; 
$n = preg_replace('~(*ANYCRLF)\h+$~m', '', $s); // if the string can contain Unicode chars, 
echo $n;          // also add "u" modifier ('~(*ANYCRLF)\h+$~um') 

詳細

  • (*ANYCRLF)は - 改行規則を指定します。(*CR)(*LF)または(*CRLF)
  • \h+ - 1+ 水平空白のC HARS
  • $ - ラインの終わり(今、CRまたはLFの前)
  • - オンマルチモード(行末の$一致)。

あなたは$は、任意のUnicodeの改行に一致できるようにしたい場合は、(*ANY)(*ANYCRLF)を交換してください。

PCRE referenceNewline conventionsを参照してください:

(*CR)  carriage return 
(*LF)  linefeed 
(*CRLF)  carriage return, followed by linefeed 
(*ANYCRLF) any of the three above 
(*ANY)  all Unicode newline sequences 

を今、あなたは両方の開始からの線をトリムし、

  • がちょうどにラインの内側に空白を縮小終了

    • する必要がある場合シングルスペース

    use

    $s = " Ł ę d \r\n Я  ёb  "; 
    $n = preg_replace('~(*ANYCRLF)^\h+|\h+$|(\h){2,}~um', '$1', $s); 
    echo $n; 
    

    PHP demoを参照してください。

  • +0

    @ChazyChazあなたの入力を読むことはutf-8です。空の置き換えが好ましいです。ウィクスターズのソリューションに投票します。おそらく 'u'フラグを追加したいでしょう(おそらくここでは必要ないでしょう)。 –

    +0

    私のPHP出力はutf-8です。入力はデフォルトです。私はすでにそのフラグを使用して検証します(preg_match)。これはより詳細ですが、Janの答えのように、私が見つけた関数を使っていないので(私はもっと単純なものが好きです)、完全なアプローチ(ちょうど後ろ向きではありません)をしたいと思います。 –

    +0

    「完全な」アプローチとは何ですか?両端から線を取り除き、2つ以上の空白をすべて1に縮小しますか? –

    0

    preg_replace (mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]])

    ので、あなたはpreg_replace('/[\s]+$/m', '', $string)

    1

    をする2つのステップのアプローチを使用します。

    <?php 
    
    $text = " first line... abc 
    second is here... def 
        <-- blank space here 
    fourth line... hi there 
    
    sith is here.... "; 
    
    // get rid of spaces at the beginning and end of line 
    $regex = '~^\ +|\ +$~m'; 
    $text = preg_replace($regex, '', $text); 
    
    // get rid of more than two consecutive spaces 
    $regex = '~\ {2,}~'; 
    $text = preg_replace($regex, ' ', $text); 
    echo $text; 
    
    ?> 
    

    a demo on ideone.comを参照してください。 (このコードは、更新1人の意志を動作しません)

    $patterns[] = ['/ +$/mg', '']; 
    

    /gmだけではなく/m

    コードがなるべきにあなたが必要

    +0

    +1(2ステップ)のアプローチでは完全には機能しません。私はまだ最後の行ではなく、行の最後に1つの空白があります。しかし、 '\ + \ r?$〜m'を追加すると動作します。 –

    0
    preg_replace('/*(.*) +?\n*$/', $content) 
    

    Live Demo

    1

    ここでの作業例:https://regex101.com/r/z3pDre/1

    更新:

    g識別子は、次のように動作しません。 $マッチが(*ANYCRLF)動詞を使ってどこ

    $patterns[] = ['/ +$/m', '']; 
    
    +0

    私はこの警告を受けています。「不明な修飾語g」です。 –

    +0

    @ChazyChaz try "mg"(gmではない) –

    +0

    私は '/ + $/mg 'を使っています。 –

    関連する問題