スレッド表示 | フラット表示〕 全トピック 920 件中 580 番目 次≫ ≪前

マルチバイト正規表現でバックスラッシュをマッチさせたい

created: 2004-07-26 17:33 | modified: 2004-07-29 01:24 | reply: 7

[1712] マルチバイト正規表現でバックスラッシュをマッチさせたい

user: | created: 2004-07-26 17:33
こんにちは。

マルチバイト正規表現で半角バックスラッシュが上手くマッチさせららません。
例えば、「Aフォルダ\ファイル.gif」という文字列のうち、「?\」(フォルダ名)を
削除したくて、

$filename = 'Aフォルダ\ファイル.gif';    //※フォルダ名は任意に変わる
mb_ereg_replace(".+\\",'',$filename);


とするとエラー
mbregex compile err: invalid regular expression;
が出てしまいます。でも、

ereg_replace(".+\\",'',$filename);


だと上手くいくんですね。
上記のようにereg_replaceで代用出来る時はいいんですが、全角文字列と半角
バックスラッシュを含めてマッチさせたい場合に困ってしまいます。
マルチバイト正規表現では半角バックスラッシュってマッチさせられないんでしょうか?
reply: 1713 1714 返信 編集 削除

[1713] エラーメッセージが違いました

user: | created: 2004-07-26 17:35
すみません、エラーメッセージは

mbregex compile err: premature end of regular expression

でした。
Parent: 1712  返信 編集 削除

[1714] 何度もすみません...

user: | created: 2004-07-26 17:38
何度もすみません。書いたコードは、

$filename = 'Aフォルダ\ファイル.gif';    //※フォルダ名は任意に変わる
mb_ereg_replace(".+[\\]",'',$filename);


でした。
Parent: 1712  reply: 1715 返信 編集 削除

[1715] basename

user: ゆうじ | created: 2004-07-27 20:55
ファイル名のみ切り出せば良いのでしたら
basename関数はいかがでしょう。

現在、テスト環境を移行中のため、
マルチバイトを含んでも大丈夫か試せてないのでご了承ください。
Parent: 1714  reply: 1718 返信 編集 削除

[1718] お返事ありがとうございます。でも…

user: | created: 2004-07-28 01:19
ゆうじさん、お返事ありがとうございます。

>ファイル名のみ切り出せば良いのでしたら
>basename関数はいかがでしょう。

せっかくアドバイスいただいたんですが、ファイル名切り出しというのは
たまたま今回作っていたコードの例でして、もっと一般的に
マルチバイト正規表現置換でのことについて質問したつもりでした。
(質問の焦点があいまいですみませんでした。
 しかも何度も間違い書き込みしてしまって…おはずかしい)

マルチバイト正規表現で半角バックスラッシュを扱えるのかどうか?って
あたりについて、どなたかアドバイスいただければ幸いです。


//basename関数、というのは使ったことがありませんでした。
//今回の件とは違いますが、また勉強してみようと思います。
//いつも何かと参考になってありがたいです。
Parent: 1715  reply: 1720 返信 編集 削除

[1720] 'p'オプション

user: ゆうじ | created: 2004-07-28 01:55
はじめの記事のタイトルにしっかりと書いてあったにもかかわらず、
ご質問の意図を思い違いしていました。
たいへん失礼しました。

php-mlの過去ログに類似した記事がありました。
PHP4.3.0以降ならば、'p'オプションをつけると
マッチしてくれるようです。

http://ns1.php.gr.jp/pipermail/php-users/2002-November/011728.html
Parent: 1718  reply: 1724 返信 編集 削除

[1724] いろいろ試してみましたところ…

user: | created: 2004-07-29 00:36
ゆうじさん、またまたお返事ありがとうございます。

ご提示のMLを読んで試してみましたが、やっぱりダメでした。
(このMLの記事は半角スペースのことについて書かれていたようです。)

で、なんとはなしにいろいろ試していたら、[\\\] と書くと半角 \ にマッチ
してくれるということが分かりました!
なんで??って感じなんですが、思うに、

1】まずはとにかく「\\」は“エスケープシーケンスのための” \ に変換される
2】そのうえで、 \\(\\\→\\となったもの) が文字列としての \ としてエスケープされる

ってことなのかなぁ?
とりあえず、なんか気持ち悪かったのがすっきりしました。
どうもありがとうございました。
Parent: 1720  reply: 1725 返信 編集 削除

[1725] 2重にエスケープ

user: ゆうじ | created: 2004-07-29 01:24
正規表現のエスケープ以前に、PHPのエスケープが働くので、
結局2重にエスケープしなくてはならないいてことになりますか。

# そういえば、ereg_replace で \ を拾うのに
# 2重にエスケープしなければならないことがありました。
# マルチバイト対応関数でもここのところは変わらずなんすね。
# 残念。


ならば、ダブルクォーテーションで挟んでいる正規表現部分を
シングルクォーテーションで挟むと良いのかも。

テスト環境が復活したら私も試してみます。
ご報告ありがとうございました。
Parent: 1724  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 580 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑