PHP:用硬替换空间替换数字之间空格的正则表达式

时间:2012-06-17 14:45:25

标签: php regex numbers space

我想根据我的国家印刷规则创建一个正则表达式,用普通空间替换硬盘空间。它不应该触及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 它不会取代第二个空格,因此结果是 - &gt;

17.&nbsp;6. 2012

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

我猜第二个空格不匹配,因为它前面的数字已经被第一场比赛消耗了。

我会使用lookbehind而不是匹配它,如下所示:

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

点在外观后面,因为lookbehind必须具有指定的长度。

希望这有帮助。

答案 1 :(得分:2)

(\d)正在吃掉第一个尾随数字,如果尾随数字只有一个数字,那么在下一次传递中就没有足够的数字来匹配。

例如,以下工作正常: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);