3

私は正規表現にかなり慣れていません。複数行のテキストでスペースを置き換える必要があります。置換規則は次のとおりです。

  • 行頭のすべてのスペースを非改行スペース (  ) に置き換えます。
  • 繰り返されるスペース (複数のスペースをまとめたもの) のインスタンスを、同じ数の改行なしスペースに置き換えます。
  • 行頭にない単一のスペースはそのまま残ります。

Regex Coachを使用してマッチング パターンを作成しました。

/( ){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

正規表現を使用して単純なテキスト置換を行うことには満足していますが、希望する出力を得るために一致内で複数回置換する方法を理解するのに苦労しています。

4

2 に答える 2

6

各スペースを見つけて置き換える方が簡単だと思います。そのためには、「先読み」グループと「後読み」グループを使用します。

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

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

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

(マークダウンは 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 : 最初は同じことを考えていました。ただし、この例では"\n " => "\n&nbsp;"、1 行目と 2 行目の間に a が示されています。

于 2008-10-16T10:48:33.927 に答える
2

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

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

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

于 2008-10-16T10:49:22.757 に答える