セミコロンが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で動作するように正規表現を「修正」する方法はありますか、それともこれを行う別のより安全な方法がありますか?
助けがあれば、WindowsXPSP3のApache2.0.64でPHP5.2.17を使用しています。(残念ながら、PHPまたはApacheのいずれかをアップグレードすることは今のところオプションではありません。)