質問

私は正規表現が初めてです。複数行のテキストのスペースを置き換える必要があります。置換ルールは次のとおりです。

  • 行頭のすべてのスペースを改行なしスペース(& nbsp; )に置き換えます。
  • 繰り返されたスペースのインスタンス(複数のスペースを一緒にしたもの)を同じ数の改行なしスペースに置き換えます。
  • 行頭にない単一のスペースは変更されません。

正規表現コーチを使用して、一致するパターンを作成しました:

/( ){2,}|^( )/

この入力テキストがあるとします:

asdasd asdasd  asdas1
 asda234 4545    54
  34545 345  34534
34 345

PHP正規表現の置換関数の使用( preg_replaceなど) () )、この出力を取得したい:

asdasd asdasd  asdas1
 asda234 4545    54
  34545 345  34534
34 345

正規表現を使用して簡単なテキスト置換を実行できてうれしいですが、希望する出力を得るためにマッチ内で複数回置換する方法を見つけるのに苦労しています。

役に立ちましたか?

解決

各スペースを見つけて置き換える方が簡単だと思います。これを行うには、「先読み」を使用しますおよび「後読み」グループ。

または、単一の空白( \ s )が先行または後に続くスペース( \ x20 )を見つけます。ただし、スペースのみを置き換えます。

$str = "asdasd asdasd  asdas1\n asda234 4545    54\n  34545 345  34534\n34 345\n";

print preg_replace("/(?<=\s)\x20|\x20(?=\s)/", "&#160;", $str);

(markdownがnbspを解析するため#160を選択しました。)

結果:

asdasd asdasd&#160;&#160;asdas1
&#160;asda234 4545&#160;&#160;&#160;&#160;54
&#160;&#160;34545 345&#160;&#160;34534
34 345

詳細については、 PCRE および perlre


コメントへの返信

@ Sprogz :最初は、同じことを考えていました。ただし、この例では&quot; \ n&quot; =&gt; &quot; \ n&amp; nbsp;&quot; を1行目と2行目の間に挿入します。

他のヒント

次のように、PHPの / e 修飾子を使用して、置換内のコードを実行できます。

$str = preg_replace('/( {2,}|^ )/em', 'str_repeat("&nbsp;", strlen("\1"))', $str);

スペースをキャプチャするために正規表現を変更しました。 / m 修飾子はそれを複数行モードにするため、 ^ は任意の行の先頭と一致します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top