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] =>
)

このQ&Aに関連する最新のQ&A

A 回答 (2件)

>この関数があるページを開くと、すでにその表示なんです・・・


そのエディタの内部処理がShift_JISで行われている何よりの証拠です

>正しく表示されているのか
正しく表示されていません
本来はそれぞれ別個のeの上に点などが付いたeに良く似た文字です

EmEditorやxyzzyを使って開いてください
何を問題としているのか分かるはずです
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/09/25 16:14

エラーそのものの原因は正規表現がおかしくなっているからです、が


>e|e|e|?|e
>u|u|?|u
この2行ですが、もっと根本的に簡単な解決は「inflector.phpを編集しないで元のまま使ってください」
その部分の記述は思いっきりUnicodeで書かれていますが、Unicode対応と言いながら実は内部でShift-JISで編集しているようなテキストエディタ(Terapadなどなど)を使って編集するとその部分が?になってしまいます

実際にはその2行(他の行もですが)はこう記述されています
(もしかすると正しく表示されないかも)
'/è|é|ê|ẽ|ë/' => 'e',
'/ù|ú|ů|û/' => 'u',
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/09/24 23:57

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qprint "{$data[$i][$j]}";の $dataと「直接関係」がある

<!DOCTYPE html>
<html>
<head>
<title>P185 Sample6-15▸ 多次元配列</title>
</head>
<body>

<?php

$data[0][0] = "東京";
$data[0][1] = 32;//$data[0][●]に東京のデータを格納します。
$data[0][2] = 25;
$data[1][0] = "名古屋";
$data[1][1] = 28;//$data[1][●]に名古屋のデータを格納します。
$data[1][2] = 21;
$data[2][0] = "大阪";
$data[2][1] = 27;//$data[2][●]に大阪のデータを格納します。
$data[2][2] = 20;
$data[3][0] = "京都";
$data[3][1] = 26;//$data[3][●]に京都のデータを格納します。
$data[3][2] = 19;
$data[4][0] = "福岡";
$data[4][1] = 27;//$data[4][●]に福岡のデータを格納します。
$data[4][2] = 22;

?>

<table border="2">
<tr bgcolor="#AAAAAA">
<th>都市名</th>
<th>最高気温</th>
<th>最低気温</th>
</tr>

<?php

for($i=0; $i<count($data); $i++){
print "<tr>";
for($j=0; $j<count($data[0]); $j++){
print "<td>{$data[$i][$j]}</td>";//配列の要素を出力する。
}
print "</tr>\n";
}

?>

</table>

</body>
</html>
以上ですが・・・だんだん難しくなってきました!
 さて
  print "<td>{$data[$i][$j]}</td>";の $dataと「直接関係」があるところは
 1) for($j=0; $j<count($data[0]); $j++){  
 2)$data[0][0] = "東京";~$data[4][2] = 22;
  の1)2)のどちらと「直接関係」があるのでしょうか?
 以上よろしくお願いいたします。

<!DOCTYPE html>
<html>
<head>
<title>P185 Sample6-15▸ 多次元配列</title>
</head>
<body>

<?php

$data[0][0] = "東京";
$data[0][1] = 32;//$data[0][●]に東京のデータを格納します。
$data[0][2] = 25;
$data[1][0] = "名古屋";
$data[1][1] = 28;//$data[1][●]に名古屋のデータを格納します。
$data[1][2] = 21;
$data[2][0] = "大阪";
$data[2][1] = 27;//$data[2][●]に大阪のデータを格納します。
$data[2][2] = 20;
$data[3][0] = "京都";
$data[3][1] = 26;//$data[3][●]に京都の...続きを読む

Aベストアンサー

> の1)2)のどちらと「直接関係」があるのでしょうか?

No.1さんと同じく質問の意味が理解できません。
わかり易く補足いただいた方が良いかと思います。



”の1)2)のどちらと「関係」があるのでしょうか?” というご質問であれば

”どちらとも関係あります” という回答になります。

Q$a[0]='w';$a[1]='r';を1回で

$a=array();
$a[0]='w';
$a[1]='r';
2行目と3行目を$a=はてな('w','r');
のように書くことはできませんか?

Aベストアンサー

こんにちは。

$a = array ( 'w', 'r' );

でいけると思いますが。

http://fol.axisz.jp/php/man/php/function.array.html

Q$_FILES['x']['error']について

知っている方いましたらご教授お願いいたします。

■事象
PHPにて画像ファイルのアップロードを作っています。
その際に、「jpg」なのに、アップロードできない画像ファイルがあります。

以下の、メッセージを取得する際には【15】が戻り値として返ってきます。
⇒$error = $_FILES['x']['error'];

エラー一覧をみても【15】というのは存在していないようで、
何が原因なのかがよくわかっていません。

■ファイルをvar_dumpしたところ
var_dump($_FILES['x']);
⇒出力結果
array(5) { ["name"]=> string(8) "attt.jpg" ["type"]=> string(0) "" ["tmp_name"]=> string(0) "" ["error"]=> int(1) ["size"]=> int(0) }

そもそも取得できていない・・・

■原因と思われるもの??
UPできない、画像のプロパティを見てみると
詳細の色の表現が「sRGB」となっています。
これが原因でしょうか?

■ファイルアップロードに関するエラーコード。
0: エラーなし。ファイルアップロード成功。
1: ファイルサイズが、「php.ini」の「upload_max_filesize」の値を超えている。
2: ファイルサイズが、送信フォームで指定した「MAX_FILE_SIZE」の値を超えている。
3: 一部しかアップロードされなかった。
4: アップロードされなかった。
6: テンポラリフォルダがない。
7: ディスクへの書き込みに失敗。
8: PHP拡張モジュールがファイルアップロードを中止。

以上、ご回答のほどよろしくお願いいたします。

知っている方いましたらご教授お願いいたします。

■事象
PHPにて画像ファイルのアップロードを作っています。
その際に、「jpg」なのに、アップロードできない画像ファイルがあります。

以下の、メッセージを取得する際には【15】が戻り値として返ってきます。
⇒$error = $_FILES['x']['error'];

エラー一覧をみても【15】というのは存在していないようで、
何が原因なのかがよくわかっていません。

■ファイルをvar_dumpしたところ
var_dump($_FILES['x']);
⇒出力結果
array(5) { ["name"]=> string(8) "attt....続きを読む

Aベストアンサー

var_dump(array_keys(preg_grep('/^15$/', get_defined_constants())));

上記のコードを用いて、エラーコード15を表す定数に何があるかどうか、そちらのPHP環境で調べてみてください。ideone.com上で調べてみたところ

・FORCE_DEFLATE
・ZLIB_ENCODING_DEFLATE
・XML_ELEMENT_DECL_NODE
・MHASH_TIGER160
・SIGTERM
・IMAGETYPE_WBMP
・SOCKET_ENOTBLK
・XML_ERROR_BINARY_ENTITY_REF

が存在していました。「SIGTERM」は強制終了を表すシグナルです。アップロード処理中にPHPコアで何らかのエラーが発生し、強制的に実行を中断させられた、と考えるのが妥当ではないでしょうか。もし古いバージョンのPHPを使ってる場合は最新版にアップデートしてください。

アップロードの例外処理に関してはこちらを参考にどうぞ。
http://qiita.com/mpyw/items/939964377766a54d4682
http://qiita.com/mpyw/items/73ee77a9535cc65eff1e

var_dump(array_keys(preg_grep('/^15$/', get_defined_constants())));

上記のコードを用いて、エラーコード15を表す定数に何があるかどうか、そちらのPHP環境で調べてみてください。ideone.com上で調べてみたところ

・FORCE_DEFLATE
・ZLIB_ENCODING_DEFLATE
・XML_ELEMENT_DECL_NODE
・MHASH_TIGER160
・SIGTERM
・IMAGETYPE_WBMP
・SOCKET_ENOTBLK
・XML_ERROR_BINARY_ENTITY_REF

が存在していました。「SIGTERM」は強制終了を表すシグナルです。アップロード処理中にPHPコアで何らかのエラーが発生し、強...続きを読む

Q正規表現パターン'/^[a-z0-9]+$/iD' の最後の"D"について

こんにちは。今PHPの勉強をしているものです。
勉強中、ctype_alnum()という関数がわからなかったのでPHPマニュアルで調べたら、「この関数は preg_match('/^[a-z0-9]+$/iD', $text) と等価です。」と書いてありましたが、英字または 数字であるかどうかを調べるのなら、パターンは'/^[a-z0-9]+$/i'だけでいいと思いますが、最後のDはいったいなんなのでしょうか?修飾子で調べて見ましたがDなどといったものは見当たりませんでした。どなたか教えていただけませんか。

Aベストアンサー

ここかな?
http://php.manual.php.to/reference.pcre.pattern.modifiers.html

Q$str=preg_replace('/\u3000/','  ',$str);

によってutf-8の空白文字をhtmlの空白文字に変換しようとしたのですがエラーになります
どうしたらいいのでしょうか?

Aベストアンサー

>そもそも?のところにコード表現で空白文字を入力する手段はないのでしょうか?
\xE3\x80\x80
で一応いいかと思いますが…


人気Q&Aランキング

おすすめ情報