JavaScript と PHP が次の正規表現を処理する方法の違いを見つけて混乱しています。
JavaScript では、
'foobar'.replace(/(?=(bar))/ , '$1');
'foobar'.replace(/(?=(bar))?/ , '$1');
'foobar'.replace(/(?:(?=(bar)))?/, '$1');
それぞれ、
foobarbar
foobar
foobar
このjsFiddleに示すように。
ただし、PHP では、
echo preg_replace('/(?=(bar))/', '$1', "foobar<br/>");
echo preg_replace('/(?=(bar))?/', '$1', "foobar<br/>");
echo preg_replace('/(?:(?=(bar)))?/', '$1', "foobar<br/>");
その結果、
foobarbar
Warning: preg_replace() [function.preg-replace]: Compilation failed: nothing to repeat at offset 9 in /homepages/26/d94605010/htdocs/lz/writecodeonline.com/php/index.php(201) : eval()'d code on line 2
foobarbar
警告についてはそれほど心配していません。しかし、JavaScript では、先読みアサーションが PHP よりも「遅延」しているようです。違いはなぜですか?これはいずれかのエンジンのバグですか? 理論的により「正しい」のはどれですか?