我想创建一个正则表达式,根据我的国家/地区的排版规则,用硬空格替换普通空格。它不应该接触 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 $3', $text);
它可以完成所有这些操作,但是:17. 6.2012它不会替换第二个空格,所以结果是 ->
17. 6. 2012
感谢您的任何帮助!
我猜第二个空格不匹配,因为它前面的数字已经被第一个匹配项消耗掉了。
我会使用回溯而不是匹配它,如下所示:
$pattern = '/(?<='d)('.?)'s('d)(?=[^>]*?(<|$))/';
$text = preg_replace($pattern, '$1 $2', $text);
点位于后视的外部,因为后视必须具有指定的长度。
希望这有帮助。
('d)
正在吃第一个尾随数字,如果尾随数字只有一个数字,则在下一次传递时将没有足够的数字来匹配。
例如,以下工作正常:12 34 56
、12. 34. 56
。但这些不是:1 2 3
,1. 2. 3
('d)
可以移到前瞻中,以避免吃掉它:
$pattern = '/(('d'.?)'s)(?='d[^>]*(<|$))/';
$text = preg_replace($pattern, '$2 $3', $text);
将此与@flec使用回溯相结合,可以得出:
$pattern = '/(?<='d)('.?)'s(?='d[^>]*(<|$))/';
$text = preg_replace($pattern, '$1 ', $text);