• 締切済み

preg_replaceでの警告

PHP5.2.4を使用しています。 CakePHPというフレームワークの中の関数で、次のような Warning (2): preg_replace() [function.preg-replace]: Compilation failed: nothing to repeat at offset 6 という警告がでるのですが、preg_replace関数の第4引数を指定してないからなのかな?と思い、 1という数字を指定してみたりしたのですが、同じような警告が出てしまいます・・・ たぶんバージョン間の違いだと思いますが、 この場合は、たとえば警告を出さないフラグを変更する以外に preg_replace関数をどのように記述すれば良いのでしょうか? function slug($string, $replacement = '_') { if(!class_exists('String')) { require_once LIBS . 'string.php'; } $map = array( '/a|a|a|a/' => 'a', '/e|e|e|?|e/' => 'e', '/i|i|i/' => 'i', '/o|o|o|o/' => 'o', '/u|u|?|u/' => 'u', '/c/' => 'c', '/n/' => 'n', '/a|a/' => 'ae', '/o/' => 'oe', '/u/' => 'ue', '/A/' => 'Ae', '/U/' => 'Ue', '/O/' => 'Oe', '/s/' => 'ss', '/[^\w\s]/' => ' ', '/\\s+/' => $replacement, String::insert('/^[:replacement]+|[:replacement]+$/', array('replacement' => preg_quote($replacement, '/'))) => '', ); /* print "string=$string<br>\n"; print_r(array_keys($map)); print_r(array_values($map)); */ $string = preg_replace(array_keys($map), array_values($map), $string); return $string; } string=test<br> Array ( [0] => /a|a|a|a/ [1] => /e|e|e|?|e/ [2] => /i|i|i/ [3] => /o|o|o|o/ [4] => /u|u|?|u/ [5] => /c/ [6] => /n/ [7] => /a|a/ [8] => /o/ [9] => /u/ [10] => /A/ [11] => /U/ [12] => /O/ [13] => /s/ [14] => /[^\w\s]/ [15] => /\s+/ [16] => /^[_]+|[_]+$/ ) Array ( [0] => a [1] => e [2] => i [3] => o [4] => u [5] => c [6] => n [7] => ae [8] => oe [9] => ue [10] => Ae [11] => Ue [12] => Oe [13] => ss [14] => [15] => _ [16] => )

みんなの回答

noname#208124
noname#208124
回答No.2

>この関数があるページを開くと、すでにその表示なんです・・・ そのエディタの内部処理がShift_JISで行われている何よりの証拠です >正しく表示されているのか 正しく表示されていません 本来はそれぞれ別個のeの上に点などが付いたeに良く似た文字です EmEditorやxyzzyを使って開いてください 何を問題としているのか分かるはずです

takagoo100
質問者

お礼

ご返答ありがとうございます。 EmEditorで表示してみたら、ちゃんとそれらしい表示がされました。 自分は普段、PHPエディタver1.78.1を使用していて、 これでUnicodeで取り込んでみたり試したのですが、 その通り表示されませんでした・・・ このPHPエディタでその通り表示させることは可能なのでしょうか? それと、cake_1.2.0.7296-rc2で他にもこのような表示バグ(動作に影響ある) がある個所はあるのでしょうか? この2つ(PHPエディタとCakePHP)について もしご存知でしたら教えてもらえないでしょうか?

すると、全ての回答が全文表示されます。
noname#208124
noname#208124
回答No.1

エラーそのものの原因は正規表現がおかしくなっているからです、が >e|e|e|?|e >u|u|?|u この2行ですが、もっと根本的に簡単な解決は「inflector.phpを編集しないで元のまま使ってください」 その部分の記述は思いっきりUnicodeで書かれていますが、Unicode対応と言いながら実は内部でShift-JISで編集しているようなテキストエディタ(Terapadなどなど)を使って編集するとその部分が?になってしまいます 実際にはその2行(他の行もですが)はこう記述されています (もしかすると正しく表示されないかも) '/è|é|ê|ẽ|ë/' => 'e', '/ù|ú|ů|û/' => 'u',

takagoo100
質問者

お礼

ご返答ありがとうございます。 こちらのエディタではUTF-8で編集していて、 編集する以前に「cake_1.2.0.7296-rc2.zip」を解凍して この関数があるページを開くと、すでにその表示なんです・・・ これは元のコードに原因があるのでしょうか? 最悪、preg_replaceをせずにそのまま$stringを返してしまっても しょうがないと妥協することも考えているのですが、 それをやると動作に致命的な影響などはあるのでしょうか? ちなみにdummさんが表示した2行は、正しく表示されているのか確認をお願いします。

すると、全ての回答が全文表示されます。

専門家に質問してみよう