我试图在每个分号后插入一个空格,除非分号是 HTML 实体的一部分。这里的例子很短,但我的字符串可能很长,有几个分号(或没有分号)。
Coca‑Cola => Coca‑Cola (‑ is a non-breaking hyphen)
Beverage;Food;Music => Beverage; Food; Music
我发现以下正则表达式可以解决短字符串的问题:
<?php
$a[] = 'Coca‑Cola';
$a[] = 'Beverage;Food;Music';
$regexp = '/(?:&#?\w+;|[^;])+/';
foreach ($a as $str) {
echo ltrim(preg_replace($regexp, ' $0', $str)).'<br>';
}
?>
但是,如果字符串有点大,preg_replace
上面的内容实际上会使我的 Apache 服务器崩溃(在页面加载时重置了与服务器的连接。)将以下内容添加到上面的示例代码中:
$a[] = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. '.
'In blandit metus arcu. Fusce eu orci nulla, in interdum risus. '.
'Maecenas ut velit turpis, eu pretium libero. Integer molestie '.
'faucibus magna sagittis posuere. Morbi volutpat luctus turpis, '.
'in pretium augue pellentesque quis. Cras tempor, sem suscipit '.
'dapibus lacinia, dolor sapien ultrices est, eget laoreet nibh '.
'ligula at massa. Cum sociis natoque penatibus et magnis dis '.
'parturient montes, nascetur ridiculus mus. Phasellus nulla '.
'dolor, placerat non sem. Proin tempor tempus erat, facilisis '.
'euismod lectus pharetra vel. Etiam faucibus, lectus a '.
'scelerisque dignissim, odio turpis commodo massa, vitae '.
'tincidunt ante sapien non neque. Proin eleifend, lacus et '.
'luctus pellentesque;odio felis.';
上面的代码(带有大字符串)使 Apache 崩溃,但如果我在命令行上运行 PHP,它就可以工作。
在我的程序的其他地方,我preg_replace
在更大的字符串上使用没有问题,所以我猜测正则表达式中的某些东西压倒了 PHP/Apache。
那么,有没有办法“修复”正则表达式,以便它可以在具有大字符串的 Apache 上工作,或者是否有另一种更安全的方法来做到这一点?
我在 Windows XP SP3 上使用 PHP 5.2.17 和 Apache 2.0.64,如果有帮助的话。(不幸的是,现在升级 PHP 或 Apache 不是一个选项。)