人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHP5.2.17の正規表現に関する質問です
以下のパターンに改行を加えたいのですがどのように書けばよろしいでしょうか?
スペースは半角スペースと全角スペースです。
'/^[一-龠々ぁ-?ァ-ヶーA-Za-z0-9A-Za-z0-9,、。 ]+$/u'


'/^[一-龠々ぁ-?ァ-ヶーA-Za-z0-9A-Za-z0-9,、。 \n]+$/u'
では動作しませんでした。
よろしくお願いします。

●質問者: appfb
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● うぃんど
●100ポイント ベストアンサー

(1)改行コードは3種類あります

・\r 古いMac
・\n UNIXライクOS(Linux,MacOSXなど)
・\r\n Windows

(2)phpで特殊文字を展開させたい場合はダブルクォートで囲みます。
シングルクォートで囲むと¥とnといった単独の文字として扱われます。
Windowsに対応させたい場合は¥rも追加します。

"/^[一-龠々ぁ-ゖァ-ヶーA-Za-z0-9A-Za-z0-9,、。  \r\n]+$/u"

http://php.net/manual/ja/language.types.string.php

5.2系は2010年にサポート終了したので、
出来るだけ早く新しいものに切り替えましょう。
5.3系も近々終了しますので、安定を求むなら5.4系、
最新にしておきたいなら5.5系を選択します。


appfbさんのコメント
ご回答、いつもありがとうございます。 おっしゃる通り『\r\n』と記入することで無事動作いたしました。 書き方が悪いのかとばかり思ってハマっていました。 シングルクオーテーションでもなぜか動いていますが、念のためおっしゃる通りパーターンはダブルクオーテーションへすべて変更いたしました。 ありがとうございます。 > 5.2系は2010年にサポート終了したので、出来るだけ早く新しいものに切り替えましょう。 このようなご指導は大変ありがたく思います。 ただ、5.3系以上にバージョンアップいたしますと、PEARのMD2などでエラーが出るため致し方なく5.2系を利用しています。 レンタルサーバーに丸ごとアップロードしてあるPEARをバージョンアップしてみようと思ったら、インストールの方法が過去やっていた方法とだいぶ変わっておりなんだかよく解らず仕舞いで今に至っております。 しかし、近いうちにPEARを最新のものにトライし、ご指導の通り5.3系以上に変更していきたいと思います。 ありがとうございました。

うぃんどさんのコメント
preg_系の関数など、シングルクォートでも動くものはあるのですが、 それを当然と思ってしまうと思わぬところで足をすくわれることになるので、 シングルとダブルの違いはしっかりと理解した上で使ってください。

appfbさんのコメント
はい、わかりました。 早速調べてみました。 http://www.24w.jp/study_contents.php?bid=php&iid=php&sid=string&cid=006 ありがとうございます。

うぃんどさんのコメント
回答に書いたリンクはphpの文字列の取り扱い方についてのマニュアルで、 シングルとダブルの冒頭に下記のように記載されています。 時間はかかると思いますがphpのマニュアルを読む練習台に読んでくださいね。 >> 変数と特殊文字のエスケープシーケンスは、 引用符 (シングルクオート) で括られた文字列にある場合には展開されません。 << >> 文字列が二重引用符 (") で括られた場合、 PHP は、より多くの特殊文字のエスケープシーケンスを理解します。 <<

tezcelloさんのコメント
PCREについて記します。 何となく誤解がありそう(生まれそう)な気がするので... 正規表現に文字として与えるか、エスケープシーケンスとして与えるかの違いがあります。 > phpで特殊文字を展開させたい場合はダブルクォートで囲みます。 > シングルクォートで囲むと¥とnといった単独の文字として扱われます 『文字列として』の表記であるならその通りですが、今回は正規表現でのパターンとしてのお話なので、「¥とnといった単独の文字として扱われ」る事はありません。 敢えて範囲を広げる必要は無いでしょう。 なので、 > シングルクオーテーションでもなぜか動いています という結果は、当然の事です。 > preg_系の関数など、シングルクォートでも動くものはある 「動くものはある」程度ではなく、ほぼ動くのでは? 注意するのは「バックスラッシュ(日本語環境では \)」を表す場合と、八進数で表現する場合くらいでしょう。 http://jp2.php.net/manual/ja/language.types.string.php#language.types.string.syntax.double http://jp2.php.net/manual/ja/regexp.reference.escape.php 参考までに、単引用符だと改行を扱う事が出来ないのではなく '/^[一-龠々ぁ-?ァ-ヶーA-Za-z0-9A-Za-z0-9,、。 ]+$/u' のように実際にそこで改行すれば他の文字と同様に扱う事が可能です。 しかし、それだと非常に読み難くなる可能性が高いので、エスケープシーケンスを使う方が便利だとされているのでしょう。

うぃんどさんのコメント
変数に格納しているのか関数に直接記述しているのかが分からなかったのと、 これまでの質問の経緯からあのような回答にしましたが、 おっしゃるとおり誤解を生む可能性は考慮すべきでした。ご指摘感謝します。

appfbさんのコメント
ご丁寧なコメントありがとうございます。 咀嚼するのに時間がかかり返信が遅くなってしまいました。 定数に格納していることは質問に書くべきでした。 しかし、お二人の回答により理解がとても深まりました。 感謝感謝です。 ありがとうございました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ