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と関連する良く見られている質問

Qなんて書いてますか? ADD ME TO MARVEL'S DO NOT EMAIL LIST C

なんて書いてますか?

ADD ME TO MARVEL'S DO NOT EMAIL LIST
CHANGE MY EMAIL PREFERENCES

By entering your email address below, you will be unsubscribed from all future commercial emails from Marvel

Confirm your email address:

Aベストアンサー

ADD ME TO MARVEL'S DO NOT EMAIL LIST
私をMarvelの「メールを送らないリスト」に加えて下さい。

CHANGE MY EMAIL PREFERENCES
私のメールの設定を変更して下さい。

By entering your email address below, you will be unsubscribed from all future commercial emails from Marvel
下の欄にあなたのメールアドレスを入力すると、今後Marvelからの商業メールの送付が全て解除されます。

Confirm your email address:
あなたのメールアドレスを(所定の欄に入力して)ご確認ください。

QPHP4で、preg_replace、preg_matchが使えません。

PHP4を、インストールしました。
ライセンスは問題なく表示されます。
PEAR.phpなどライブラリが一切読み込めないようです。
また、
preg_replace、preg_matchが使えません。

Aベストアンサー

> PEAR.phpなどライブラリが一切読み込めないようです。
> preg_replace、preg_matchが使えません。

どんなスクリプトを書いたとき、どんなエラーメッセージが出ますか?
「どうダメなのか」を詳しく書けば、
その分だけ早く解決するかもしれません。

QTO DO LISTを日本語で言うと?

よくビジネスで、TO DO LISTって使いますよね。
手帳なんかにも出てきますね。

文字通り「やらなければならないことのリスト」という意味であることはわかるのですが、
そういう直訳的・説明的な訳ではない、ひとことでビシッと言い表せる定訳ってありますでしょうか?

ビジネスの現場にあまり詳しくないので、ビジネス関係の方、みなさんどんなふうに言ってらっしゃるか知りたいと思います。
よろしくお願いします。

Aベストアンサー

#1でございます。すこし補足を。


日本国内にはじめてファイロファクスの「システム手帳」が入ってきた時に、今までの日本の手帳にはないまったく新しい概念のリフィルがありました。それが「TO DO LIST」です。

やるべきことを羅列していくだけの用紙ですが、画期的だったのは「チェックマーク」を入れる部分があったことです。

完了したものにはチェックを入れて「済」ということにしておけば一目瞭然であり、チェックの入っていない項目だけを注意して見ていれば良いわけです。

こうしたTODOLISTの「忘れていることが明瞭にわかる」という機能に対して、日本語の備忘(忘れたときのための備え)という意味を重ね合わせて「備忘録」と呼んでいました。

当時のシステム手帳を使い始めた人たちが同様に感じてTODOLISTを「備忘録」と呼んでいたわけで、英訳がどうこうという話ではないのです。

Qpreg_replace ereg_replace

いつもお世話になっております。

データを抽出する前にサニタイズが必要となり、
実行する処理で、

$rep = "/\\\/";
$arr = array('data1' => 'A', 'data2' => '\\\\\\');

$ret = preg_replace($rep , "\\\\\\" ,$arr );
$ret = ereg_replace("'", "\'" ,$ret);

preg_replaceは配列で戻ってくる事は知っているのですが、
ereg_replaceは配列で戻ってくるのでしょうか。

お手数ですが、宜しくお願い致します。

Aベストアンサー

マニュアルに書いてなければ、「対応していない」と考えるのが普通だと思います。

http://www.php.net/manual/ja/function.ereg-replace.php
> 置換後の文字列を返します。

http://www.php.net/manual/ja/function.preg-replace.php
>subject
> 検索・置換対象となる文字列もしくは文字列の配列
>戻り値
> subject 引数が配列の場合は配列を、 その他の場合は文字列を返します。

と、配列に対応しているpreg_replaceでは、ちゃんと「配列」と明記してあるのですから。

QOUTLOOKより軽いスケジューラ(TO DO LIST)

現在、OUTLOOKをスケジュール管理ソフトとして使っていますがかなり重いので他のものを探しています.
SCHEDULE WATCHER がいいときいて試してみたのですが
TO DO LISTの機能で定期的な仕事を入力する機能がないので困っています.
他にお勧めはありませんでしょうか
宜しくお願いいたします.

Aベストアンサー

私も、一時期スケジューラにはまって集めた記憶があります。
そのとき、SCHEDULE WATCHERも使用しました。
いっぱい集めたのですが、Zclock98というソフトも使用しました。
このソフトは、今Zclone98と名前を変えて配布されています。
ダウンロードして試してみてはいかがでしょうか。

(「定期的な仕事」という内容がよくわかりません。もう少し具体的に表記していただけませんか?)

参考URL:http://hp.vector.co.jp/authors/VA002242/zclone98/help_html/index.html

Qpreg_matrchとpreg_replace

$settings['link_url3'] = preg_replace("/\//","\\\/",$settings['site_url3']);

$url = "http://www.google.co.jp/";

$remote = @fopen($url, "r") or myerror("remote URLをオープンできません");
while ($html = fread($remote,1024)) {
if (preg_match("/${settings['link_url3']}/i",$html)) {$found=$found + 1; break;}
}

という文があったのですが、preg_replaceとpreg_matchのところがいまいちよく解りません。
(preg_replaceとpreg_matchの中の /i とか /\// とか \\\/ の部分が・・・。)

Aベストアンサー

正規表現と言うものです。
http://www.mnet.ne.jp/~nakama/

Qto.do.に関して

I have not choise but to do so.
のto do so.が何故to do soなのかわかりません。
to do so.には何の意味があるのでしょうか?
to.do.に対して理解できてません。

Aベストアンサー

前に書いているはずです。
まず、古いイギリス英語なら have not もありますが、
普通は I don't have any choice ~か、I have no choice です。

I have no choice but to do so. で「そうするより仕方がない」

「そうする」とは何かは前に書いているはずです。
これだけの例文なら、そういう前提での文と考えるしかありません。

Qpreg_replace, ereg_replace

$bodyにはテキストファイルなどから読み込んだ、$dateと言う文字(変数ではない)と、改行を含む文字列。

それで、「$date」を、phpスクリプト上の$dateの値に置換したく、

$tmp = preg_replace("/\$date/s", $date, $body);
または、
$tmp = ereg_replace("\$date",$date,$body);
としたのですが、どうも置換されません。何がいけないのでしょうか?

Aベストアンサー

>$が行末記号でないようにするために、頭に「\」を
>付けたのですが、なぜここで\$としたのにもかかわ
>らず、行末記号として認識されてしまったのでしょ
>うか・・・

「$date」はPHPの変数を意味します。その扱いはダブルクォート内部でも同じです。
従ってダブルクォート内部では「\$date」ではじめて文字列としての「$date」になります。
このままでは#1に書いた通り「行末」を意味しますので「文字」としての「$」とするために「\\」を更に付加します。
結果「"\\\$date"」という記述になります。

ダブルクォートを使用せずにシングルクォートを使用すると「'\$date'」とそのまま書けたりします。

QI'd like to do の過去形は?

「~したい」というときには、"I want to do"と言いますが、polite expression では、"I'd like to do"だということを以前教わって理解していたつもりなのですが、ふと「過去形では何と言うのかな?」という疑問が湧いてきました。

「~したかった」というときの"I want to do"の過去形は、"I wanted to do"だとわかるのですが、"I'd like to do"の過去形はどうやって表せばいいのですか?

"I'd like to do"は"I would like to do"だから、"I would have liked to do"になるのでしょうか?

Aベストアンサー

ご存知と思いますがなかなか英語と日本語は一対一には対応していないため、言い方はその内容により異なってきます。

>「やっと英会話スクールに入りました。前から行きたかったんです。」
という例ならば、普通に want でかまいません。(I've wanted to learn English in ESL classとか色々)
特に丁寧さに掛けるというわけでもありません。
あと、earger とか他の言葉による表現もあります。

なぜかというと、そもそもwantが強い表現で避ける理由は、自分の欲求をあからさまに主張する表現だから、それが実現していないにもかかわらず主張することがあさましい感じがするからなのです。

ですからそれをさけて would like to ~として、自分の欲求自体を仮定法を使って願望に変えているわけです。
つまり暗黙に、[if possible,] I would like to ~ と仮定の中において話しているから、控えめな表現とされるわけです。[]内は言葉にしませんがさまざまな適当な文に置き換えられるわけです。
日本語で言えば、「出来ましたら、~したいのですが、、、」のような表現ということです。

すでに実現した出来事に対して過去の自分の気持ちを言う場合には、would like のような表現は意味を成しません(仮定ではないわけですから)、wantのもつあさましさがあるわけではありません。(すでに実現しているから)

過去にそう思っていただけで現在も実現していないのであれば、仮定法過去をつかう表現にすることでwantのもつ浅ましさを消せるということです。

実現しているのであればwantは特に問題のある表現では無いということです。

ご存知と思いますがなかなか英語と日本語は一対一には対応していないため、言い方はその内容により異なってきます。

>「やっと英会話スクールに入りました。前から行きたかったんです。」
という例ならば、普通に want でかまいません。(I've wanted to learn English in ESL classとか色々)
特に丁寧さに掛けるというわけでもありません。
あと、earger とか他の言葉による表現もあります。

なぜかというと、そもそもwantが強い表現で避ける理由は、自分の欲求をあからさまに主張する表現だから、それが...続きを読む

Q【PHP】preg_replace() で正規表現が正常に動かない?

PHP5利用者です。
preg_replace() が思い通りに動かないため困っています。
マルチバイト文字及び正規表現を使おうとした場合動作がおかしいのです。例えば、
「 . 」は任意の1文字とされていますが、
$str = preg_replace("/第.回/", "第3回", "今日は第*回目です。");
等と書いても何も置換されません。
これは一体どういうことなのでしょうか?
文字コードはUTF-8です。
お詳しい方、よろしくお願いいたします。

Aベストアンサー

> $str = preg_replace("/第.回/", "第3回", "今日は第*回目です。");

preg_replace に渡すパターンに u フラグをつけておかないと
渡されたデータがUTF-8であるとは認識されません。
したがって、 '.' は一文字ではなく一バイトにマッチすることになってしまいます。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング