- 1 名前:nobodyさん [2007/01/11(木) 02:40:43 ID:uW7xEbZY]
- 【正規表現道場の掟】
・言語不問 ・質問も大歓迎。使用言語を書くのを忘れずに。 正規表現と関係ない話・質問は他スレへどうぞ。
- 108 名前:106 [2007/07/20(金) 05:38:28 ID:wp5plGkY]
- 「このように置換されることを想定しています。 」の部分で
実体参照の部分がそのまま表示されてしまったので全角で修正します。 よろしくお願いします。 tt&quot;tt&lt;3bbb st<a gg&tg;gg href="aaa">bbb&lt;
- 109 名前:nobodyさん mailto:sage [2007/07/20(金) 08:47:21 ID:???]
- 何がやりたいのかさっぱりだ。
どこまでがタグか解析してタグ以外のタグ文字を実体参照化したいということ? それ元のテキストを生成してる時点で何か間違ってるだろ
- 110 名前:nobodyさん mailto:sage [2007/07/20(金) 12:57:58 ID:???]
- 何かの内側と外側を判定するのは結構面倒だよなぁ。こないだ<a 〜>から</a>までの
間だけを操作しようと3分考えて、ネストがありえることに気付いて挫折した。
- 111 名前:nobodyさん mailto:sage [2007/07/20(金) 13:08:08 ID:???]
- って>>106読んでなかった。>>109に同感。
それじゃあどこからどこまで切れば良いのかわからない。 xxx<abcd<ddeg<eee<g<fhg>degh><qq>zzz の時、何が保証されていて、どこからどこまでをタグと見なせばいいの。
- 112 名前:106 [2007/07/21(土) 01:21:27 ID:VYWED9XA]
- ごめんなさい。説明が足りませんでした。
掲示板で投稿された書き込みに対して、上記のような処理をしたいと考えています。 >>106のスクリプトは処理を掲示板に組み込む前に処理の部分だけテストするために作成したものです。 $textは書き込み内容と想定しています。 一番内側の<>をタグと見なしたいです。 xxx<abcd<ddeg<eee<g<fhg>degh><qq>zzz この場合ですと、<fhg>と<qq>をタグとみなし、他は実体参照化したいと考えています。
- 113 名前:nobodyさん mailto:sage [2007/07/21(土) 02:45:37 ID:???]
- つまりタグの定義は
<[^>]*> ということですね。
- 114 名前:106 [2007/07/21(土) 08:55:35 ID:VYWED9XA]
- >>113
左様です。
- 115 名前:nobodyさん mailto:sage [2007/07/21(土) 09:30:47 ID:???]
- 違うだろ、<[^<]*?>だろ、112の定義なら。
それ以前に106はエスケープ、エンコード、サニタイズ処理で何か間違ってる use HTML::Entities; $tag_re = qr/<[^<]*?>/; $text =~ s/($tag_re)|(.)/$1||encode_entities($2)/eg; print $text;
- 116 名前:nobodyさん [2007/07/21(土) 13:10:23 ID:7GHIEbSO]
- PHPで
localhost/index.htm https://localhost/index.htm test.com/index.htm から /index.htm /index.htm /index.htm これを出力したい場合 ereg_replace('^https?://(localhost|test.com)' ,'' ,$line); これでは間違ってるでしょうか? どなたか教えて下さい。お願いします
- 117 名前:たけもー [2007/07/27(金) 23:18:07 ID:boPeFaxI]
- PHPです。
就職率−6月(この全角−を)半角に変えたいです。 $a = ereg_replace("[−]", "-", $a); どうしたらいいでしょうか?
- 118 名前:nobodyさん [2007/07/28(土) 02:31:21 ID:k6nESKD8]
- ereg_* はマルチバイト文字(全角文字)に対応していない。
mb_ereg_* か preg_* を使うといい。 ただしpreg_*のほうはUTF-8でないとダメだったと思う。
- 119 名前:たけもー [2007/07/28(土) 15:25:04 ID:9w1k0jgB]
- PHPです。
就職率−6月(この全角−を)半角に変えたいです。 $a = mb_ereg_replace("[−]", "-", $a); mb_でもだめでした。 どうしたらいいでしょうか?
- 120 名前:nobodyさん mailto:sage [2007/07/28(土) 15:37:30 ID:???]
- 文字コードとかどうなっとるん?
- 121 名前:たけもー [2007/07/28(土) 16:32:13 ID:9w1k0jgB]
- 文字コードの意味がいまいちわからないんです、テキストディタは
Shift-JISです、
- 122 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 01:50:43 ID:???]
- PHPは本職じゃないんで良く知らんのだが、PHP自体がデフォルトの
エンコーディングを持っていて、何も指定しないとそれ使うはずだから、 自分がSJIS指定しているつもりでも、そうでない可能性があるってこと。 <?php echo mb_internal_encoding() . "\n"; echo mb_regex_encoding() . "\n"; $v = "就職率−6月"; mb_regex_encoding("sjis"); echo mb_regex_encoding() . "\n"; $v = mb_ereg_replace("[−]", "-", $v); echo $v; こんなんで置換はできたっぽい。 echo しているのは確認のためなんで気にしないでいい。 いずれにしろ mb_regex_encodingで設定しないとダメだった。
- 123 名前:たけもー [2007/07/30(月) 07:40:51 ID:DqqhKvmn]
- 解決いたしましたw
ありがとうございますw
- 124 名前:たけもー [2007/07/30(月) 21:23:25 ID:TD8Lc2Id]
- 解決したはずが・・・
file(http://)で取得した文字列がUTF-8で UTF-8からsjisにしたら全角マイナスが消えてしまいます。 消えて、改行されています・・・ テストソースですので mb_ereg_replace などで置き換えなどは一切してません。 どうしてでしょうか?
- 125 名前:nobodyさん mailto:sage [2007/07/30(月) 23:11:52 ID:???]
- 原因知ってるけど正規表現に何の関係が
- 126 名前:nobodyさん mailto:sage [2007/07/30(月) 23:54:01 ID:???]
- >>125
誘導してやってくれ。(PHPわからん)
- 127 名前:nobodyさん mailto:sage [2007/07/31(火) 01:38:26 ID:???]
- ちなみにPerlも同じだから。正規表現は関係ないけどね。
- 128 名前:nobodyさん mailto:sage [2007/07/31(火) 02:17:21 ID:???]
- >>126
変換に使っている変換表の問題(なので正規表現の問題じゃない)。 PHPで使っている変換表の素性はわからん。 ぐぐれば「波ダッシュ問題」あたりとならんで見つかると思うけど どっかのスレで話題になったか、これ? www.google.com/search?sourceid=mozclient&ie=utf-8&oe=utf-8&q=utf8+%E5%A4%89%E6%8F%9B+%E5%85%A8%E8%A7%92%E3%83%9E%E3%82%A4%E3%83%8A%E3%82%B9+%E5%8C%96%E3%81%91%E3%82%8B ま、がんがって調べてくれ >たけもー
- 129 名前:nobodyさん mailto:sage [2007/07/31(火) 02:24:36 ID:???]
- △▲ WebProg 初心者の質問 Part15 ▼▽
pc11.2ch.net/test/read.cgi/php/1169725490/ ここ、かなあ。 つーか、元の要件でもこのスレと無関係な str_replace で済むじゃん。
- 130 名前:nobodyさん [2007/08/10(金) 10:21:28 ID:dRcI3VfS]
- PHPとか全く知らない者なのですが、利用しているBBSのアクセス禁止設定が
正規表現で指定しろと言うんです。勿論正規表現は知らないどころか初めて耳にしました。 a00abcd1.kngwnt01.ap.so-net.ne.jp 123.123.123.123.ap.yournet.ne.jp 前者のIPが何らかのコード1つに変換されるタイプと後者のIPがそのまま出るタイプの リモホをそれぞれホスト単位で全て「正規表現で指定」するとずばりどういう表記になるのでしょう?
- 131 名前:nobodyさん mailto:sage [2007/08/10(金) 10:29:11 ID:???]
- ホスト数が少ないなら列挙すりゃいいんじゃね。
(xxx.example1.jp|xxx.example2.jp|xxx.example3.jp)
- 132 名前:nobodyさん mailto:sage [2007/08/10(金) 13:25:55 ID:???]
- ありがとうございます
なるほど…ひとつをピンポイントで指定する場合は 正規表現というのを使わなくても良いという事なのでしょうか… 130の前者だけなら a00abcd1.kngwnt01.ap.so-net.ne.jp と、そのまま指定、両方の二つなら (a00abcd1.kngwnt01.ap.so-net.ne.jp|123.123.123.123.ap.yournet.ne.jp) となるんでしょうか?
- 133 名前:nobodyさん mailto:sage [2007/08/10(金) 18:16:54 ID:???]
- >>132
そのものずばりというのも正規表現の一種だよ。 a00abcd1.kngwnt01.ap.so-net.ne.jp というのも正規表現だよ。 あと細かい話を言うと、ピリオド「.」は正規表現において任意の1文字にマッチするメタ文字なので、 ピリオドそのものにマッチさせたい(他の文字にはマッチさせたくない)ときには「.」の代わりに「¥.」を使う。 a00abcd1¥.kngwnt01¥.ap.so-net¥.ne¥.jp んでも、この場合はそこまでしなくても問題はなさそうだけどね。
- 134 名前:nobodyさん mailto:sage [2007/08/10(金) 22:15:38 ID:???]
- >>133
どうもありがとうございました!大変参考になりました というかこれを機会にちょっと勉強してみます… ありがとうございました
- 135 名前:nobodyさん [2007/08/11(土) 01:30:22 ID:2Sf3pkhN]
- .*
と .+ は、完全に同じ意味と考えてもOKですか? それとも、何か挙動が変わってくることはありえますか?
- 136 名前:nobodyさん mailto:sage [2007/08/11(土) 02:02:02 ID:???]
- .+ 1文字以上の任意の文字列
.* 0文字以上の任意の文字列 で最初から違ってましたね ナハハ…
- 137 名前: ◆xIL6SyuS5U mailto:sage [2007/08/11(土) 02:39:04 ID:???]
- a
- 138 名前:nobodyさん mailto:sage [2007/08/14(火) 22:01:22 ID:???]
- perl互換のPHP正規表現を勉強し始めたのですが、
3.3以上に該当するの文字列っていうのは、できますでしょうか? たとえば3.3.4や3.5、9.0などです。 バージョンのようなものです。 やはり数値型でないと難しいのでしょうか。
- 139 名前:nobodyさん mailto:sage [2007/08/14(火) 22:20:59 ID:???]
- バージョン番号文字列って数値型にしてもめんどくさいんだよね。
3.10.0 とかね、真面目にやろうとすると、 '.' で split して、上の桁から順に整数値として比較していく、 みたいにやらないといけなかったりして。
- 140 名前:nobodyさん mailto:sage [2007/08/14(火) 23:03:21 ID:???]
- >>139
3.3以上っていう決まりだけならどうかけますかね? 3.2があてはまらなければ大丈夫なんですが。
- 141 名前:nobodyさん mailto:sage [2007/08/15(水) 00:01:44 ID:???]
- /\A(?:(?:[1-9]\d+|[4-9])(?:\.(?:[1-9]\d*|0))*|3\.(?:[3-9](?:\.(?:[1-9]\d*|0))*))\z/
- 142 名前:nobodyさん mailto:sage [2007/08/15(水) 00:28:29 ID:???]
- 3.10 も 3.20 も蹴っていいの?
- 143 名前:141 mailto:sage [2007/08/15(水) 01:17:11 ID:???]
- うわボケてたアルよ。
/\A(?:(?:[1-9]\d+|[4-9])(?:\.(?:[1-9]\d*|0))*|3\.(?:(?:[1-9]\d+|[3-9])(?:\.(?:[1-9]\d*|0))*))\z/
- 144 名前:nobodyさん mailto:sage [2007/08/15(水) 22:05:09 ID:???]
- >>141
ありがとー!ちょっと見てみます! >>142 厳密にどういった値があり得るのかも分からないのでそこまで細かくしなくてもいいかなという感じです。 バージョンというか、ユーザーエージェントの後によくついている数値なんですが。
- 145 名前:nobodyさん [2007/09/01(土) 14:16:44 ID:tMwZKBAJ]
- "*"をWebで調べると「直前の文字0回以上の繰り返しにマッチ」とでてくる。
UNIXで % ls a0/ a1/ a2/ のとき % cd *1 ができるけど*は何の繰り返し??? *は何でもマッチと思っていたのは間違いですか???
- 146 名前:nobodyさん [2007/09/01(土) 15:26:18 ID:epTGamb+]
- >>145
Perl互換の正規表現では 「*」 は量指定子というものの一種でありまして、 文字、 文字クラス、 グループの直後に付き、 それらに0回以上の繰り返しという意味を持たせるのですが、 正規表現体系が違えば 「*」 が違うことを意味することもありましょう。
- 147 名前:nobodyさん [2007/09/01(土) 15:34:18 ID:epTGamb+]
- 要するに、 正規表現体系が違えば記号の意味も異なるということです。
- 148 名前:nobodyさん [2007/09/01(土) 15:58:40 ID:tMwZKBAJ]
- >>146
>>147 理解しました。ありがとうございました。
- 149 名前:nobodyさん [2007/09/01(土) 16:54:59 ID:fGUplrri]
- [2ch公式広告]
一瞬、ハーバーライフと間違えるところだった。。 違うよ、コレは。 ヤフオク関連の最強情報 これを知らずして、ヤフオクで稼ぐことは出来ない。(キッパリ) 2ch2.net/.l?=jd2e
- 150 名前:nobodyさん mailto:sage [2007/09/02(日) 03:27:50 ID:???]
- >>145-148
待てw
- 151 名前:nobodyさん mailto:sage [2007/09/02(日) 03:54:38 ID:???]
- >>150
どっちも「それは正規表現じゃねえよ」からグダグダと書いても仕方ないから 待たせなくてよい。
- 152 名前:nobodyさん [2007/09/02(日) 09:50:38 ID:RtluGpKC]
- 192.168.50.5 //OK
192.168.*.* //OK 1000.1000.1000.1000/OK *.168.50.5 //NG (\d+)(\.([*(\d+)])){3} なぜこれでダメ?
- 153 名前:nobodyさん [2007/09/02(日) 11:04:51 ID:tGLa/mAn]
- >>150-151
正規表現とは文字列の集合を表現する手段でありますから、 ワイルドカードを用いた表現も正規表現の一種であります。
- 154 名前:nobodyさん [2007/09/02(日) 11:20:25 ID:tGLa/mAn]
- >>152
> (\d+)(\.([*(\d+)])){3} これは数字があり、 その後ピリオドと 「*」、 「(」、 数字、 「)」、 「+」 のどれかの組が3回繰り返す文字列群の表現です。 > *.168.50.5 これは数字の後、 ピリオドと 「*」、 「(」、 数字、 「)」、 「+」 のどれかの組が2回しか繰り返していないので、 先ほどの正規表現にマッチしません。
- 155 名前:nobodyさん [2007/09/02(日) 11:40:01 ID:tGLa/mAn]
- いや、 待ってください。
> (\d+)(\.([*(\d+)])){3} だと、 > 192.168.50.5 > 192.168.*.* > 1000.1000.1000.1000 > *.168.50.5 のすべてにマッチしないはずです。 先ほど > これは数字があり、 その後ピリオドと 「*」、 「(」、 数字、 「)」、 「+」 のどれかの組が3回繰り返す文字列群の表現です。 と申しましたが、 より正確には、 ・ 数字が1つ以上あり、 その後ピリオドと 「*」、 「(」、 数字1つ、 「)」、 「+」 のどれかの組が3回繰り返す文字列群の表現 でありまして、 > 192.168.50.5 > 192.168.*.* > 1000.1000.1000.1000 > *.168.50.5 のどれもそのような文字列ではないからです。
- 156 名前:nobodyさん mailto:sage [2007/09/02(日) 12:28:15 ID:???]
- \.
- 157 名前:nobodyさん mailto:sage [2007/09/02(日) 13:10:37 ID:???]
- どうせ1000がいやんって話なんだろうけど、0から255までの
数字だけがマッチする正規表現ってむずくね? [0-9]|[12][0-2]?[0-9]|[12]?[34][0-9]|1?[5-9][0-9]|25[0-5] とか [0-9]|1[0-9][0-9]?|2[0-4]?[0-9]|[3-9][0-9]|25[0-5] とか
- 158 名前:nobodyさん mailto:sage [2007/09/02(日) 19:09:05 ID:???]
- PHPのPerl互換の正規表現のことで質問です。
次のような文章があったとします。 左のは行番号で、実際の文章中にはありません。 01.<div> 02.text 03.<img> 04.</div> 05. 06.<div> 07.text1 08.text2 09.</div> 10. 11.<div> 12.hoge 13.<img> 14.</div> ちなみにドットは改行にもマッチするようにしておきます。 これに対してパターン「<div>\n(.+)\n</div>」を最小マッチさせると、 サブパターンで02,03と07,08と12,13と17,18,19,20行目がそれぞれきちんとマッチしてくれるんですが、 今度は<img>を含むdivだけをマッチさせようとして、「<div>\n(.+\n<img>)\n<div>」で最小マッチをさせると、 02,03と07,08,09,10,11,12,13行目にマッチしてしまいます。 ここで02,03と12,13行目だけにマッチさせるにはどうすればいいのでしょうか? いろいろ考えたのですがよくわかりません。 どなたかよろしくお願いします。
- 159 名前:nobodyさん [2007/09/02(日) 19:35:53 ID:/HflMMhV]
- ↑
すいません 「02,03と07,08と12,13と17,18,19,20行目がそれぞれきちんとマッチしてくれる」は 02,03と07,08と12,13の間違いですね
- 160 名前:nobodyさん mailto:sage [2007/09/02(日) 20:08:53 ID:???]
- すいません自己解決しました
「<div>\n((?:[^<]|<(?!div))+\n<img>)\n<div>」 これでいけるんですね
- 161 名前:nobodyさん [2007/09/04(火) 05:14:07 ID:p30GnV0e]
- IPアドレスの正規表現についてやっぱりわからなかったです。
2オクテッド目以降は*が来てもOKとするにはどうすればよいでしょうか? 192.168.50.* 192.168.*.* 192.*.*.* 192.168.50.5 1000.1000.1000.1000 これらはすべてOKとします。
- 162 名前:nobodyさん mailto:sage [2007/09/04(火) 09:42:52 ID:???]
- >>161
> 2オクテッド目以降は*が来てもOKとするにはどうすればよいでしょうか? それ先に言えよ! どういう結果が欲しくて、どう書いたら、どうダメだったか、を具体的に書かんと。 あと、使用してる処理系 (言語やソフトウェア) も。 で、ダメだった正規表現中の [*(\d+)] だけど、 [] は「文字クラス」の正規表現なので、 >>154 の言っているように * ( 数字 + ) のいずれかの「文字」を表す。 「* または数字」を表現したいのであれば、 (\*|\d+) みたいにする。 ので、こうかな。 (\d+)(\.(\*|\d+)){3}
- 163 名前:nobodyさん [2007/09/04(火) 11:21:03 ID:/G1gxUUQ]
- $` (マッチした文字列の前にあるすべての文字列 )
↑これの使い方を教えてください。言語はPerlです。
- 164 名前:nobodyさん mailto:sage [2007/09/04(火) 11:29:12 ID:???]
- >>163
"hoge" =~ /og/; print join(",", $`, $&, $'), "\n"; ↑こんな感じで、この場合は "hoge" に対して "og" がマッチするので、 $`, $&, $' にはそれぞれ "og" の前の "h", "og", "og" の後ろの "e" が格納される。
- 165 名前:nobodyさん [2007/09/04(火) 11:54:02 ID:/G1gxUUQ]
- >>164
できました。ありがとうございます。
- 166 名前:nobodyさん mailto:sage [2007/09/09(日) 01:04:12 ID:???]
- ***.com([0-9]もしくは[a-z]の文字が3つ並び、その後に.com)の表記方法を教えてください
- 167 名前:nobodyさん [2007/09/10(月) 21:26:12 ID:lrmAiBXN]
- >>166
Perl互換の正規表現だと [0-9a-z]{3}\.com
- 168 名前:nobodyさん mailto:sage [2007/09/12(水) 05:01:53 ID:???]
- >>166
\w{3}\.com
- 169 名前:nobodyさん [2007/09/12(水) 11:22:48 ID:DkIOyoGe]
- >>168
それだと大文字とアンダースコアにもマッチしてしまいます。
- 170 名前:nobodyさん mailto:sage [2007/09/15(土) 15:32:58 ID:???]
- <title>ほげほげ</title>
の「ほげほげ」だけを抜き出すのにはどう表記すればいいのでしょうか?
- 171 名前:nobodyさん mailto:sage [2007/09/15(土) 16:48:18 ID:???]
- /<title>([^<]+)<\/title>/
- 172 名前:nobodyさん mailto:sage [2007/09/15(土) 17:17:54 ID:???]
- >>171
ありがとうございます。
- 173 名前:nobodyさん [2007/09/16(日) 01:35:56 ID:6P4HpCmY]
- PHP 4.4.7で
hoge hage 123.txt の中から 123 を抜き出したいんだけど "/^(.+?).txt/" だと当然 hoge hage 123 がマッチしてしまう。 hoge や hage は任意の文字列で数字が入る可能性もあるのだけど、どうやって抽出したらいいんでしょう。
- 174 名前:173 mailto:sage [2007/09/16(日) 02:11:14 ID:???]
- マッチした文字列を
strrev() で逆順にして、今度は txt. で再度マッチングさせたらとりあえず抽出できました。それをもう一度逆順に。 こんな力業じゃなくて他に方法があるんだろうな……。
- 175 名前:nobodyさん mailto:sage [2007/09/16(日) 02:19:07 ID:???]
- ^^
- 176 名前:nobodyさん [2007/09/16(日) 03:52:16 ID:vOvwrq99]
- >>173
前後にデリミタ (「/」) が付いているという事はPerl互換の正規表現関数を使うのでありましょうが、 そうであれば 「.」 はs修飾子がない限り改行にマッチせず、 よって /^(.+?).txt/ は hoge hage 123.txt にマッチせず、 したがって hoge hage 123 がキャプチャされることはないはずです。
- 177 名前:nobodyさん mailto:sage [2007/09/16(日) 12:32:40 ID:???]
- >>173
まあとにかく「マッチしてしまう」とかいうそのコードを晒してみ。
- 178 名前:nobodyさん [2007/09/16(日) 13:59:22 ID:G/qusHMm]
- $bairitsu = 0.5;という風に$bairitsuに倍率を入れておいて
height:244pt を height:122pt… height:244pt を height="150"に といった具合にheight:●●ptやheight="●●"の数値部分を $bairitsu倍して置換するにはどのようにすればいいですかね? やろうとしてることは、エクセルで作ってHTMLで保存したものを、 A4サイズの用紙に合うようにHTMLの中にあるサイズ指定を変更したいです。 使用言語はPerlです。よろしくお願いします。
- 179 名前:173 [2007/09/16(日) 15:18:36 ID:6P4HpCmY]
- >>175
それは……ヒント? それともAA? >>176 失礼。パターンを行頭にしたり行末にしたり改行文字にしたりしてるうちにこんがらかってしまったみたい。 正確には "/^(.+?).txt/" でマッチしました。 >>177 コード的にはこんな感じ。 $string = " hoge hage 123.txt "; preg_match("/^(.+?).txt/", $string, $matches); preg_match("/txt.(.*?)\r/", strrev($matches[0]), $matches); echo strrev($matches[1]); // 結果 123 PHPも正規表現も初心者なので変な書き方してるかもだけど……。
- 180 名前:173 mailto:sage [2007/09/16(日) 15:27:38 ID:???]
- あれ?正確にはも何も最初に書いたのであってるなあ。
なんで「マッチしてしまう」のだろう。
- 181 名前:nobodyさん [2007/09/16(日) 21:38:24 ID:YMkvDZNb]
- >>179
ああ、 改行コードをCRにしているのですね。 私は > 「.」 はs修飾子がない限り改行にマッチせず と申しましたが、 正確には 「LFにマッチせず」 でありまして、 CRにはマッチします。 普通はスクリプトの内部では文字列の改行コードをLFにするものですが、 何か理由があってCRにしているのですか。
- 182 名前:nobodyさん [2007/09/16(日) 21:48:57 ID:YMkvDZNb]
- 改行コードがLFなら、 m修飾子を使うことにより 「^」 が行頭にマッチするようになるのです。
- 183 名前:173 [2007/09/17(月) 00:37:12 ID:/5o1hJUZ]
- >>181
> と申しましたが、 正確には 「LFにマッチせず」 でありまして、 CRにはマッチします。 あー、そういう事なのか……。 勉強になります。 > 何か理由があってCRにしているのですか。 実はいつも決まった形式で入稿されるテキスト原稿を決まった形式のHTMLにするだけの仕事が定期で入ってくるんです。 で、毎回毎回コピペにつぐコピペで対応し続けるのもバカくさいので極力自動化しようと思い、PHPでシコシコ書いている次第。 そのプログラムに食わせるお客さんからの入稿原稿を元に作ってたのでCRになってました。 試しに改行コードをLFにしてm修飾子というのを試したらうまくいきました。 なるほどもらった原稿をLFに変換してから使えばいいわけだな。 ありがとーございました!
- 184 名前:nobodyさん [2007/09/17(月) 01:05:58 ID:T68tRmUw]
- あと1つ指摘しますと、 「.txt」 は 「\.txt」 にすべきですね。
- 185 名前:173 [2007/09/17(月) 15:37:44 ID:/5o1hJUZ]
- > あと1つ指摘しますと、 「.txt」 は 「\.txt」 にすべきですね。
おーなるほど。ありがとうございます。
- 186 名前:nobodyさん [2007/09/18(火) 14:10:13 ID:hpuf++fz]
- Perlを使って、アフィリエイトのコードやJavaScriptなどを含むコメントタグがなぜか削除できません。
例) <!-- コード ・ ・ --> HTMLタグは s/<.*?>//sg; とすれば削除できますが なぜかコメントタグだけが残ってしまいます。 コメントタグの開始「<」と終了「>」以外の全ての文字列・記号・改行コードを削除したうえで s/<>//g; としてみましたが削除することができません。 s/<//g; s/>//g; とするとなぜか削除できます。 うまく削除できる方法をご存知の方がいたら教えて下さい。
- 187 名前:nobodyさん mailto:sage [2007/09/18(火) 16:31:55 ID:???]
- 前処理としてまず s/<!--.*?-->//gs やってみたら?
コメントタグのネストはないだろうし(JavaScriptとかで書き出してたら別だけど・・)
- 188 名前:nobodyさん mailto:sage [2007/09/19(水) 07:54:55 ID:???]
- >>187
レスどうもありがとう。 s/<!--.*?-->//gsでもなぜかうまくいかないので コメント行が現れたらif文でスルーするようにしました。
- 189 名前:nobodyさん mailto:sage [2007/09/19(水) 21:54:47 ID:???]
- PHPで正規表現勉強したいんですが、オライリーのふくろう本を読めるでしょうか?
もちろん本人の技量にもよると思いますが、Perlをまったく知らない人間がという解釈でお願いします。 逆に文字列処理をしたいなら、Perlを一からやっとけみたいなのもありです。
- 190 名前:nobodyさん mailto:sage [2007/09/20(木) 00:20:26 ID:???]
- >>189
preg_.*系関数ならPerl互換なのでふくろう本の記述が使えると思う。 というかね、ふくろう本のキモは処理系にほとんど依存しない3章と4章で、 それ以外はおまけだ。熟読すべし。
- 191 名前:nobodyさん mailto:sage [2007/09/20(木) 01:57:42 ID:???]
- ありがとう。時期を見計らって購入するよ。第三版出るみたいだし
- 192 名前:nobodyさん mailto:sage [2007/09/20(木) 02:42:28 ID:???]
- >>191
え、日本語訳出るの?
- 193 名前:nobodyさん [2007/09/20(木) 13:36:17 ID:KlmMrt1+]
- <TD width="52" height="25" bordercolor="#CCCCCC" valign="middle">
<div align="center">F8FA</div> </TD> これの 「F8FA」の部分をpreg_match_all取得したいのですが、 '/<TD .*><div .*>(.*)</div><\/TD>/Ums' としたのですが、何も取得されません。 どのように表記すれば良いのでしょうか?
- 194 名前:nobodyさん mailto:sage [2007/09/20(木) 13:42:18 ID:???]
- /<TD.*?><div.*?>(.*)?</div><\/TD>/
こんな感じ?
- 195 名前:nobodyさん mailto:sage [2007/09/20(木) 13:44:34 ID:???]
- 試してないけどひとまずパッと見でおかしそうなのを直すとこう?
'/<TD .*>\s*<div .*>(.*)<\/div>\s*<\/TD>/Ums'
- 196 名前:nobodyさん [2007/09/20(木) 17:00:54 ID:SqIRO2nC]
- '#<TD(?:\s[^>]*)?>\s*<div(?:\s[^>]*)?>(.*)</div>\s*</TD>#ms'
- 197 名前:nobodyさん mailto:sage [2007/09/20(木) 19:58:25 ID:???]
- >>193
正規表現は二作出てるから次も一年たった今頃出るかなという予想込みだけど出なかったら出ないのもタイミングかなと。
- 198 名前:nobodyさん mailto:sage [2007/09/20(木) 22:27:42 ID:???]
- >>197
日本語でおk
- 199 名前:nobodyさん mailto:sage [2007/09/20(木) 23:09:32 ID:???]
- >>198
おk!=日本語
- 200 名前:nobodyさん mailto:sage [2007/09/21(金) 00:43:48 ID:???]
- >>191
ソースは?
- 201 名前:nobodyさん [2007/10/02(火) 19:12:55 ID:DsttFroa]
- PHPの正規表現でユーザーエージェント(IE限定)から
ブラウザバージョンとOSのバージョンを取得するため 以下を作成しました preg_match('/Mozilla\/.*(MSIE [0-9\.]+);.*(Win[^;\)]+|Mac[^;\)]+).*/i', $lua, $match) ほぼ間違いなく取得できるのですが唯一以下形式のエージェントのみ 失敗します Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; Yahoo! JAPAN Version Windows 95/NT CD-ROM Edition 1.0.; DigExt) 古いバージョンなので切り捨てても良いとは思うのですが悔しいので どうすれば正しく取得できるか教えていただけないでしょうか? 上記の正規表現では MSIE 5.0 Windows 95/NT CD-ROM Edition 1.0. ほしいのは以下 MSIE 5.0 Windows 98
- 202 名前:nobodyさん mailto:sage [2007/10/02(火) 19:26:37 ID:???]
- m#(MSIE\D*[\d\.]+).*?((?:Win|Mac)\D+\d+)#
こんな風でどう?
- 203 名前:nobodyさん [2007/10/02(火) 19:34:02 ID:DsttFroa]
- >>202
ありがとうございます おかげ様でできました 比較検証して勉強させてもらいます
- 204 名前:nobodyさん [2007/10/05(金) 23:08:47 ID:ivRnBDKk]
- 質問です
$text = "第41条 [国会]は、[国権]の最高機関であつて、国の唯一の[立法機関]である。"; というテキストで[]でくくられた部分を検索エンジンに飛ばすためのリンクに書き換えるための置換処理を行いたいと考えています。 そこで下のように組んでみたところ $text =~ s/\[(.*)\]/(<a href=\/http:\/\/foo.bar?query=\"$1\">$1<\/a>)/; 置換の対象となるカッコは行の先頭の[から行の最後の]までが対象となってしまい。上手く機能しません。 この置換処理はどうかけば、いいのでしょうか?
- 205 名前:nobodyさん mailto:sage [2007/10/06(土) 00:06:57 ID:???]
- >>204
* や + は、そのままだと最長の文字列でマッチしてしまうので、 最短マッチにするために .*? みたいにすると良い。 あと、繰り返し処理させるために、 g オプション (/.../g みたいな) を付けるよろし。
- 206 名前:nobodyさん mailto:sage [2007/10/06(土) 00:07:46 ID:???]
- $text=~ s#\[(.*?)\]#my$r=$1;(my$s=$1)=~s/([^\w ])/'%'.unpack('H2',$1)/ge;
$s=~tr/ /+/;'[<a href="foo.bar?query='.$s."\">$r</a>]"#ges; こんな風でどう?
- 207 名前:nobodyさん [2007/10/06(土) 00:35:40 ID:1+GhnPpX]
- >>205-206
どちらも上手く機能しました。 奥が深いですね
- 208 名前:nobodyさん [2007/10/06(土) 16:42:21 ID:kTx5Crj6]
- 普通の文字として\を表現するにはどうすればいいですか?
C言語風には、'\\'みたいなやつです
|

|