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 它不会替换第二个空格,所以结果是 ->

17.&nbsp;6. 2012

感谢您的任何帮助!

4

2 回答 2

4

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

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

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

点在后视之外,因为后视必须具有指定的长度。

希望这可以帮助。

于 2012-06-17T15:23:31.933 回答
2

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

例如,以下工作正常:12 34 56, 12. 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 回答