2

私の国の活版印刷の規則に従って、通常のスペースをハードブレイクスペースに置き換える正規表現を作成したいと思います。HTMLタグには触れないでください。

これらの例のすべてのスペースは、ハードブレイクである必要があります。

数字

1 000
10 000
100 000
1 000 000
etc..

日付

17. 6.
17. 6. 2012

私は思いついた:

$pattern = '/((\d\.?)\s(\d))(?=[^>]*(<|$))/';
$text = preg_replace($pattern, '$2&nbsp;$3', $text);

これらすべてを実行できますが、次のようになります。17. 6. 2012 2番目のスペースは置き換えられないため、結果は->

17.&nbsp;6. 2012

助けてくれてありがとう!

4

2 に答える 2

4

2番目のスペースは、その前の数字が最初の一致ですでに消費されているため、一致していないと思います。

次のように、一致させる代わりに後読みを使用します。

$pattern = '/(?<=\d)(\.?)\s(\d)(?=[^>]*?(<|$))/';
$text = preg_replace($pattern, '$1&nbsp;$2', $text);

後読みには指定された長さが必要なため、ドットは後読みの外側にあります。

お役に立てれば。

于 2012-06-17T15:23:31.933 に答える
2

(\d)最初の末尾の数字を食べており、末尾の数字が1桁しかない場合は、次のパスで一致するのに十分な数字が残っていません。

たとえば、次のように正常に機能します:12 34 5612. 34. 56。しかし、これらはしません:1 2 31. 2. 3

(\d)を食べないように、先読みに移動することができます。

$pattern = '/((\d\.?)\s)(?=\d[^>]*(<|$))/';
$text = preg_replace($pattern, '$2&nbsp;$3', $text);

これを@flecのルックビハインドの使用と組み合わせると、次のようになります。

$pattern = '/(?<=\d)(\.?)\s(?=\d[^>]*(<|$))/';
$text = preg_replace($pattern, '$1&nbsp;', $text);
于 2012-06-17T15:21:33.447 に答える