2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

正規表現道場@2ch Part4

1 :nobodyさん:05/01/17 11:51:25 ID:SH1ygN1P
Perlに限らずスクリプト系言語で大活躍の正規表現。
このスレは有用そうな正規表現を紹介したり、
どう表現したらいいかわからないときに質問をしたりするためのスレッドです。
質問するときは使用言語や得たい結果をなるべく詳しく書きましょう。

註:& や " を書くときには、& " と描いておきましょうね。

Perlメモ
 http://www.din.or.jp/~ohzaki/perl.htm
正規表現メモ
 http://www.kt.rim.or.jp/~kbk/regex/regex.html
Regex::Diagram.pm
 http://www.cc.rim.or.jp/~midorin/mad-p/RegexDiagram.html
正規表現
 http://www.cc.rim.or.jp/~midorin/mad-p/perl/benkyou/PRC2kRegex/
UNIX正規表現入門 目次
 http://www01.u-page.so-net.ne.jp/jc4/hiroyuki/rex_index.html
Regular Expression(Riue ちゃんの正規表現講座) - Index
 http://www.sixnine.net/regexp/

ほとんどは↓のリンク集にまとまっています。
正規表現最新リンク集2002
 http://www2.famille.ne.jp/~akio1998/l_grep.html

過去スレ
正規表現道場@2ch
 http://pc.2ch.net/test/read.cgi/php/996105815/
正規表現道場@2ch Part2
 http://pc2.2ch.net/test/read.cgi/php/1038146241/
正規表現道場@2ch Part3 s/煽り|荒らし/あぼーん/g
 http://pc5.2ch.net/test/read.cgi/php/1069245758/


2 :nobodyさん:05/01/17 13:15:29 ID:???
(´・ω・) 2ゲットしちゃった

3 :nobodyさん:05/01/17 21:55:47 ID:???
余裕で3ゲト

4 :nobodyさん:05/01/17 22:04:02 ID:???
  。


5 :nobodyさん:05/01/17 22:30:18 ID:???
perlなんですが、

$msg = "組織運営図";
if ( $msg =~ /(.*)運営(.*)/ ){
print "ok. $1$3\n";
} else {
print "NG\n";
}

上のコードで okに行って欲しいんですが、
マッチしてくれません…。
何か根本的な勘違いしてますでしょうか。


6 :nobodyさん:05/01/17 22:49:27 ID:???
>>5
文字コードは Shift_JIS だよね?あと $1$3 じゃなくて $1$2 だよね?
Perl 5.8 を使ってるなら、最初で use encoding 'Shift_JIS'; としてみる。
それ以前のバージョンの Perl ならとりあえず /(.*)\Q運営\E(.*)/ としてみる。

7 :nobodyさん:05/01/17 23:11:27 ID:???
本題とずれるけど、最初のサブパターンは(.*?)にしたほうが効率いい。

8 :5:05/01/18 09:38:37 ID:???
>>6,7
use encoding 'Shift_JIS';
これでいけました。

こんな単純なことだったとは…
これで昨日一日つぶしちゃった…orz
激しく感謝ですw


9 :nobodyさん:05/01/18 16:31:30 ID:???
Speeeeedと言う置き換えソフトを使っています。
ヘルプには
・メタ文字 \Gは使用できません。
・'/'はエスケープする必要はありません。
修飾子は以下の3つをサポートしています。
k  文字を日本語(シフトJIS)として扱いします。
m 文字列を複数行として扱います。
i  大文字と小文字を区別しないで検索します。
と、あります。

--------この下が一行目-------
スレッド名
Thu, 29 Jan 2004 17:27:16 GMT
1002
0

http://hoge.com/bbsname
3
0


0
1075476984
0
-----ここまで--------
の2chブラウザのidxファイルを置き換えて
3行目の一文字目("1002"の"1")が1で、
3行目が4桁である時に
7行目を"3"にしたいのですが
speeeeedの検索文字列と置き換え文字列の欄には何を入れれば良いのでしょうか?

よろしくお願いします。

10 :nobodyさん:05/01/18 17:37:11 ID:TA2apQcG
>>9
「・・・で・・・である時に」なんていう条件分岐の機能は持ってないだろ。

11 :nobodyさん:05/01/18 19:28:22 ID:???
>>9
修飾子 m をセットして、検索文字列、置換文字列をそれぞれこんな感じかな。
\A(.*\n.*\n)(1\d\d\d\r\n)(.*\n.*\n.*\n)(.*\n)
$1$2$3\r\n

12 :nobodyさん:05/01/19 03:18:24 ID:hI5VxZ7o
「ある文字列を含んでいたら」という判断をさせたいのですが、
どんな風に記述すればよいでしょうか?

13 :nobodyさん:05/01/19 03:21:30 ID:???
>>12
if (/ある文字列/)

14 :12:05/01/19 03:40:05 ID:hI5VxZ7o
言い方が悪かったですね、
変数がある文字を含んでいたら、という判断をさせたいのです

15 :nobodyさん:05/01/19 03:41:19 ID:???
if (変数 =~ /ある文字列/)

16 :nobodyさん:05/01/19 04:29:16 ID:???
$_ = 変数;
if (/ある文字列/)


17 :nobodyさん:05/01/19 04:41:05 ID:???
>>14
判断は正規表現とは関係ない。
それはただの条件分岐。

18 :nobodyさん:05/01/19 14:27:09 ID:???
>>10
プログラム側の処理を分けるのは制御構造の役割だが、
正規表現内部では、条件付きサブパターンというのがある。

19 :nobodyさん:05/01/19 15:32:02 ID:???
>>18
特定の言語での独自拡張を持ち出したってしょうがないだろ

20 :9:05/01/19 16:01:45 ID:???
>>11
ありがとうございました。

21 :nobodyさん:05/01/19 16:04:47 ID:???
PCERはC言語だっけ
正規表現を独自拡張してない実装ってどれのこと?

22 :nobodyさん:05/01/19 16:39:56 ID:???
>>21
PCRE

23 :nobodyさん:05/01/19 16:48:15 ID:???
>>18,21
条件付パターンマッチと言っても、変遷で表現できるので、正規表現で解が求まる
ペールはたまたま、読みやすさかなんかのために、独自の表記方法を導入してるが、
処理としては普通。実装とは関係ない。abcはabならcにマッチする、というのと変わらん

24 :nobodyさん:05/01/19 16:57:37 ID:???
>>23
そもそも組み合わせ爆発する「条件分岐」を事も無げに処理してくれるのがオートマトンさんのクールなところですよ

25 :nobodyさん:05/01/19 17:23:49 ID:???
>>20
どいたしまして。
Speeeeed は初めて知ったので自信無かったけどうまくいったみたいでよかった。


なんだか話題が変な方向に行ってるみたいだけど、
>>12=14 が実装言語に何を使っているか限定せずに質問を始めたのがまずい気がする。

質問するひとは、はじめに何使ってるかをちゃんと示しておくべきだと思う。

26 :nobodyさん:05/01/19 17:30:52 ID:???
関係ないけど、丸投げ体質の奴ってどこまでも果てしなく丸投げるよな

27 :nobodyさん:05/01/19 18:42:24 ID:???
おまいら前スレ埋めれ

28 :nobodyさん:05/01/20 02:59:30 ID:???
丸投げしちゃう

29 :nobodyさん:05/01/20 20:17:30 ID:???
EUC-JPの漢字だけにマッチするようにしたいのですが
下記だとどうやら全角英数にもマッチしてしまうみたいです。

preg_match('/[\xB0\xA1-\xF4\xA4]/', $str)

どのようにしたら漢字だけにマッチするようになるでしょうか?

30 :nobodyさん:05/01/21 11:13:19 ID:ALcAsVlr
1005hw9fCDDLlBeZ0%253D

1005hw9fCDDLlBeZ0
にしたい(ようは、%以降の文字列を削りたい。%は1回しかでてこない)
にはどうすればいいでしょか?
なお、php4です。

$srt_o = preg_replace("/^(.*)(\%.*)(.*)$/i", "$1$3", $srt_o);
でもうまくいかず・・・

31 :30:05/01/21 11:22:49 ID:ALcAsVlr
むだをはぶいて、以下のようにしましたが
変換されずでしたわ・・・

$srt_o = preg_replace("/^(.*)(\%.*)$/i", "$1", $srt_o);

32 :30:05/01/21 11:25:14 ID:???
すいません、仕様変更で(汗)
、最後に出てきる%の文字列以降を削除する方法を教えてくださいませ

33 :nobodyさん:05/01/21 11:25:24 ID:???
>>30
$str = '1005hw9fCDDLlBeZ0%253D';
$str = explode('%',$str,1);
var_dump($str);

で。正規表現(゚听)イラネなときは出来るだけ使わない。


34 :nobodyさん:05/01/21 11:27:07 ID:???
それなら正規表現使わんでもstrpos+substrとかexplode+array_shiftでも可能だけど
とりあえずpreg_replace('/%.*/', '', $str_o);

35 :nobodyさん:05/01/21 11:29:12 ID:???
「最後に」ってことならstrrpos+substrの組み合わせか、
preg_replace('/%[^%]*$/', '', $str);
%はエスケープ不要よ。

36 :33:05/01/21 11:30:24 ID:???
>>30
訂正
$str = '1005hw9fCDDLlBeZ0%253D';
$str = explode('%',$str,2);
var_dump($str);





37 :nobodyさん:05/01/22 16:28:46 ID:Z5CU+gTj
レベルの高い会話の中申し訳ありません。

2
00:02:19,916 --> 00:02:21,084
I can't move!

3
00:02:24,879 --> 00:02:27,215
Help me! I can't move!

4
00:02:27,882 --> 00:02:28,591
Oh my god!

このような文字列のtxtファイルを英語の部分のみ下のように取り出したいのですが
I can't move!
Help me! I can't move!
Oh my god!

いいソフトはありますかと聞いたところ正規表現ならできると聞き、このスレに来ました。

上の条件を満たすにはどのようにすればいいのでしょうか?

38 :nobodyさん:05/01/22 16:48:23 ID:???
>>37
「ソフトありますか」からここに来るのがいまいちよくわからんな。
正規表現の書き方が知りたいのか?
できるけど正規表現が使えるソフトかなんらかのスクリプトなどが
ないと意味ないぞ。

39 :nobodyさん:05/01/22 17:04:14 ID:Z5CU+gTj
>>38
正規表現が使えるソフトは自分でみつけました。
あとはそこに%$?みたいな記号を入れるのですが、それがわからないのです。

40 :nobodyさん:05/01/22 17:06:17 ID:???
>>37
grepでいいでしょ。

明らかに板違いだね。

ココから来たのかよ。
気軽に「こんなソフトありませんか?」 6
http://pc5.2ch.net/test/read.cgi/software/1104587671/695

とりあえず、放置推奨 >all

41 :nobodyさん:05/01/22 17:08:33 ID:???
>>39
しょうがないな。

そのソフト名が俺らにはわからんから、アドバイスするのは不可能。

42 :nobodyさん:05/01/22 17:31:54 ID:???
>>39
>>1から調べられる

43 :nobodyさん:05/01/25 07:32:45 ID:???
>>29
$strが漢字一文字の時マッチ。
preg_match("/^[\xb0-\xff][\xa0-\xff]$/", $str)

意図が今ひとつ分からないから、こんなもんで。

44 :nobodyさん:05/01/26 10:23:23 ID:???
「」に囲まれていないタグ(<と>)を<、>に変換したいのですがどのようにすればよいでしょうか?
逆に囲まれているというのは出来るのですが囲まれていない方が分からないです。。。

45 :nobodyさん:05/01/26 10:27:00 ID:???
すいません。上の変換後の文字は「&lt;」「&gt;」です。

46 :nobodyさん:05/01/26 13:29:10 ID:???
>>44
囲まれているのができるのならば、

(1) 囲まれている<と>を適当にぶつからない文字or文字列に変換する。
制御文字とかがオススメ。
(2) 残った全ての<と>は囲まれていないのでお前の好きなように変換する
(3) (1)で変換したものを元の<と>に戻す

とすればいいはずだな。


47 :nobodyさん:05/01/26 13:30:28 ID:???
>>44
Perl でいい?ちょっと苦しい感じもするけどこんなのとかどうでしょう?

$str =~ s/(?:(「.*?」)|(\<))/$1||"<"/ge;
$str =~ s/(?:(「.*?」)|(\>))/$1||">"/ge;

48 :47:05/01/26 13:33:15 ID:???
ガーソ!
置換後のダブルクォーテーションの中は「&lt;」「&gt;」です。

$str =~ s/(?:(「.*?」)|(\<))/$1||"&lt;"/ge;
$str =~ s/(?:(「.*?」)|(\>))/$1||"&gt;"/ge;

49 :nobodyさん:05/01/26 13:51:01 ID:???
>>46 >>47
おおぅ!ありがとうございます。おかげで実現出来ましたm(_ _)m

50 :nobodyさん:05/01/26 20:12:30 ID:???
>>44>>47
&amp;lt;って書きたいときには&amp;amp;lt;って書けばいいんだよ。

51 :nobodyさん:05/01/27 01:51:00 ID:???
SQLのエスケープをしようと、「'」「\」「%」は全て「\'」「\\」「\%」に
変換する正規表現を書いてみました。

$sql =~ s/(\'|\\|\%)/\\$1/g;

正常に動作しているみたいなのですが、異常系のパターン
文字列等ございましたらご指摘いただきたい次第です。

宜しくお願いします。

52 :nobodyさん:05/01/27 14:08:43 ID:???
>>51
それで特に問題ないように思うけど、
そもそもな話で、SQL のエスケープの仕様ってそれで良いの?っていうのと、
DB のライブラリにはエスケープする関数が用意されてることが多いので
そっちを調べた方が良い気がする。

53 :nobodyさん:05/01/28 02:31:31 ID:???
>>52
ご返答有難うございます。
おそらくこの3つをエスケープすれば良いかと思うのですが、
他にもあるのでしょうかね、、

スレ違いっぽいので他のところで聞いてみます。

54 :nobodyさん:05/01/28 12:52:16 ID:???
$a = "a1a2a3a4s1s2s3s4d1d2d3d4f1f2f3f4"
%a = $a =~ /([a-z])(\d)/g;
とすると
$a{a} == 1;
のようになりますが、括弧が4つの時に$2と$4だけを毎回ハッシュに渡すには
どうすればいいんですか?

%a = $a =~/(([a-z])\d)([a-z](\d))/g;

$2と$4だけを毎回%aに渡したいのです。

55 :nobodyさん:05/01/28 13:08:00 ID:???
>>54
(?: ) で後方参照されなくなるので、こうするとか。

%a = $a =~/(?:([a-z])\d)(?:[a-z](\d))/g;

56 :54:05/01/28 13:37:42 ID:???
>>55
ありがとうございました!

57 :54:05/01/28 13:50:40 ID:???
すみませんもう一つHTMLに対しての正規表現なのですが、
$html_1 = qq|<input type="hidden" name="test1" value="a">|;
$html_2 = qq|<input type="hidden" value="a" name="test1">|;

%hiddenというのの中にnameの値をキーにvalueの値を値にしたハッシュを作成したいです。
わからないのは
my %hidden = $html_1 =~ m{<input type="hidden"\s*(?:name="(.*?)")?\s*(?:value="(.*?)")?.*?>};
$html_1に対してはこれでいいですが$html_2に対してはこれではキーがありません;

nameとvalueの順番がなんでもいいようにするにはどうすればいいですか?

58 :nobodyさん:05/01/28 18:09:31 ID:???
>>57
一発でマッチする方法はあるかなあ?俺はこんなのしか思いつかなかった。
my $params = ($html =~ m{<input\s+type="hidden"([^>]+)>})[0];
my %hidden = $params =~ m{(?:\s+(\w+)="([^"]+)")}g;

59 :nobodyさん:05/01/28 22:09:22 ID:???
>>57
素直に 2 回マッチさせるのが無難じゃないかなぁ,こんな感じで。

my %hidden = map {/\bname="(.*?)"/, /\bvalue="(.*?)"/} $html_2, ;


60 :nobodyさん:05/01/30 11:46:21 ID:???
こんな?

my %hidden = $html_2 =~ /<input type="hidden".*?(?=.*?\bname="(.*?)").*?\bvalue="(.*?)".*?>/;



61 :nobodyさん:05/01/30 16:30:48 ID:???
>>60
それいいなw
%hidden =
  $html =~
    /<input(?=.*?\btype="hidden")(?=.*?\bname="(.*?)")(?=.*?\bvalue="(.*?)").*?>/g;
こうすると type=hidden が後ろになっても取れるのかー。戴きます。

62 :nobodyさん:05/01/30 19:07:48 ID:60wlVefX
質問です。

test.txtというファイルに
|aaaaaaaaaa|ddddddddddddd|ggggggggggggg|
|ffffffffff|hhhhhhhhhhhhh|jjjjjjjjjjjjj|
|mmmmmmmmmm|uuuuuuuuuuuuu|lllllllllllll|
というのが書かれているとします。

このファイルをUNIX上でcat test.txt | perl test.cgi
というコマンドを打ちます。

test.cgiの処理として
'<>'で標準入力からtest.txtの内容を読み込んで、
'|'を区切り文字としてテーブルタグに変換させる
正規表現を書ける人いませんか?

<table>
<tr><td>aaaaaaaaaa<td></td>ddddddddddddd<td></td>ggggggggggggg</td></tr>
<tr><td>ffffffffff<td></td>hhhhhhhhhhhhh<td></td>jjjjjjjjjjjjj<td></td>
<tr><td>mmmmmmmmmm<td></td>uuuuuuuuuuuuu<td></td>lllllllllllll<td></td>
</table>

というふうに変換したいのですが、うまく正規表現が書けません


63 :nobodyさん:05/01/30 19:10:42 ID:60wlVefX
間違えました。

<table>
<tr><td>aaaaaaaaaa<td></td>ddddddddddddd<td></td>ggggggggggggg</td></tr>
<tr><td>ffffffffff<td></td>hhhhhhhhhhhhh<td></td>jjjjjjjjjjjjj</td></tr>
<tr><td>mmmmmmmmmm<td></td>uuuuuuuuuuuuu<td></td>lllllllllllll</td></tr>
</table>

↑のように変換したいのですが

64 :nobodyさん:05/01/30 19:14:46 ID:???
書ける人いませんか?  という質問か。
ま、いくらでもいます。

65 :nobodyさん:05/01/30 19:17:56 ID:60wlVefX
>>62
どのような正規表現で処理したら良いのか教えてください。

66 :nobodyさん:05/01/30 20:23:18 ID:???
>>62
行頭の|を<tr><td>に置き換え。s/^\|/<tr><td>/;
行末の|を</td></tr>に置き換え。s/\|$/<\/td><\/tr>/;
その他の|を</td><td>に置き換え。s/\|/<\/td><td>/g;
<table></table>は適当に付ける。

67 :nobodyさん:05/01/30 21:16:39 ID:???
Perlで、
\Q〜〜\E
はどういう意味ですか?

68 :nobodyさん:05/01/30 21:23:52 ID:???
>>67
>>1

69 :nobodyさん:05/01/30 21:44:03 ID:???
各サイトでCtrl+Fしてみましたが、\Qも\Eも見つかりませんでした

70 :nobodyさん:05/01/30 22:24:11 ID:???
>>69
誰が Ctrl+F しろと言った?見つかるまで全て読めよ。

71 :nobodyさん:05/01/31 01:31:35 ID:???
いや、普通にマニュアル読んだほうが早いが・・

72 :nobodyさん:05/01/31 07:14:59 ID:???
すみません、たまたまJAVAスレを見ていたら書いてありました;

73 :nobodyさん:05/01/31 12:58:10 ID:???
>>70
調子こいてんじゃねーよ。雑魚が。

74 :nobodyさん:05/01/31 13:13:56 ID:???
m9(^Д^)プギャーーー!!

75 :nobodyさん:05/02/02 10:56:57 ID:hb9v8KSn
すみません。
若気の至りで、アクセス解析を読み込むためのJSファイルをHTML文書の頭に付けてたのですが、
思い直して</body>直前に入れなおしたいと思ったのですが、

speeeeed!(k,m,iオプション有)で、置換する際に、

<body><script type="text/javascript" src="foo.js"></script>
本文
</body>

・bodyとscriptの間に改行はない
・bodyにidが振られている場合もある
で、

<body(.*?)>(<script.*?script>)(.*?)</body>

<body$1>$3$2</body>

とやってみたのですが、うまくいきませんでした。

ためしに、
<script.*?script>だけでマッチングを試してみたのですが、
<script type="text/javascript" src="foo.js"></script>にマッチしませんでした。

どう書き直したらよいのでしょうか?
全く根本的に間違ってるような予感がしますが、お教え下さいますよう宜しくお願いいたします。

76 :nobodyさん:05/02/02 12:18:04 ID:???
>>75
<body(.*)>(<script.*script>\r\n)((.*\r\n)*)</body>

<body$1>\r\n$3$2</body>

77 :nobodyさん:05/02/02 15:04:00 ID:???
perlで文中の"&"を"&"に変換したいと思ってます。
でも"¥"などの実体参照化されてる部分の"&"は変換しません。
で自分なりに考えたのですが↓

$text="<p>キュウリ&ナス=¥200</p>";
$text=~s/&[^(yen;|euro;|amp;|copy)]/&/g;
print "$text¥n";

を実行すると、結果が

<p>キュウリ&ス=¥200</p>

となり、うまくいきません。
2行目の正規表現がおかしいと思うのですが、どう変えたらいいのでしょうか?
よろしくお願いします。

78 :nobodyさん:05/02/02 15:10:51 ID:???
どこから突っ込んだものか・・・

79 :77:05/02/02 15:12:58 ID:???
再びすいません実体参照部分が化けてしまいました、文中の全角記号、英字は実際は半角です;;

perlで文中の"&"を"&amp;"に変換したいと思ってます。
でも"&yen;"などの実体参照化されてる部分の"&"は変換しません。
で自分なりに考えたのですが↓

$text="<p>キュウリ&ナス=&yen;200</p>";
$text=~s/&[^(yen;|euro;|amp;|copy)]/&amp;/g;
print "$text¥n";

を実行すると、結果が

<p>キュウリ&amp;ス=&yen;200</p>

となり、うまくいきません。
2行目の正規表現がおかしいと思うのですが、どう変えたらいいのでしょうか?
よろしくお願いします。

80 :nobodyさん:05/02/02 15:33:41 ID:???
>>77
これでどう?

$text =~ s/(?:(&(?:yen|euro|amp|copy);)|&)/$1?$1:"&amp;"/ge;

81 :nobodyさん:05/02/02 15:37:52 ID:???
ここに居る人たちからすると10点くらいの答案だと思う

82 :80:05/02/02 15:39:46 ID:???
>>81
ならどこがどうダメとかこうしろとかくらい言ってくださいな。

83 :nobodyさん:05/02/02 15:41:22 ID:???
この質問者にレスを打っただけで50点はかたいだろ。

84 :77:05/02/02 15:41:45 ID:???
>>80
難しすぎて分かりませんが、バッチリ出来ました!
ありがとうございます。

85 :nobodyさん:05/02/02 15:50:43 ID:???
$text=~s/&[^(yen;|euro;|amp;|copy)]$/&amp;/g;

86 :nobodyさん:05/02/02 19:20:05 ID:???
偉そうにしてるだけのカスがいるようだなw
ダメだとか言う前に自分のコード見せてみなm9(^Д^)プギャー

87 :nobodyさん:05/02/02 19:25:17 ID:???
煽ってるだけの人も、変わらんかとm9(^Д^)プギャー

88 :nobodyさん:05/02/02 21:33:17 ID:???
>>77
$text =~ s/&(?!(?:yen|euro|amp|copy);)/&amp;/g;

89 :nobodyさん:05/02/02 23:52:44 ID:???
つーか問題は本当にこの4つだけでいいのかってことだろ。

HTML4 で使える文字実体参照
http://www.ne.jp/asahi/minazuki/bakera/html/reference/charref

90 :nobodyさん:05/02/02 23:56:25 ID:???
$text =~ s/&$/&amp;/g;

91 :nobodyさん:05/02/03 04:21:06 ID:???
考えてみたけど汎用的なのはどうやっても無理

92 :nobodyさん:05/02/03 04:59:36 ID:???
>>89
それは >>77 が判断すればいいことで、わざわざそんな表を持ち出す話ではない。

93 :nobodyさん:05/02/03 06:34:35 ID:???
>>92
77を100回読んで出直してください

94 :nobodyさん:05/02/03 06:43:00 ID:???
一から教え込むスレじゃないんで、既存のを丸パクりしろって回答で100点じゃね。

95 :nobodyさん:05/02/03 07:26:47 ID:???
>>94はやりチン包茎

96 :nobodyさん:05/02/03 09:12:37 ID:???
m9(♥Д♥)プギャー

97 :nobodyさん:05/02/03 13:43:04 ID:???
my %entref = (
yen => 1,
euro => 1,
amp => 1,
copy => 1,
# 気が済むまで並べる
);

$text =~ s/(?:(&(\w+);)|&)/$1&&$entref{$2}?$1:"&"/ge;

98 :nobodyさん:05/02/03 20:21:27 ID:???
アイディア出す人は古い車輪に対するアドバンテージが何か書いてくれると助かる

99 :nobodyさん:05/02/03 20:27:30 ID:???
見易さかな?

100 :nobodyさん:05/02/03 22:15:55 ID:???
>>98
古い車輪はある?

101 :nobodyさん:05/02/03 22:25:28 ID:???
「車輪」言いたかっただけちゃうんかと

102 :nobodyさん:05/02/03 22:50:41 ID:???
根こそぎひろってハッシュサーチのほうが性器表現でやるより早いってとこだろ。
古い車輪だと機械的に最小の性器表現を生成したりするんだが、まず読めないし遅い。

103 :nobodyさん:05/02/03 23:37:30 ID:???
スピードにばらつきが出ないだけで、体感的にはかわらなそう

104 :97:05/02/04 00:47:42 ID:???
いや、速度とかはどうでもよくてメンテナンス性重視のつもり。

105 :nobodyさん:05/02/04 18:09:48 ID:???
>>104
今どきだな。俺も保守的なので97のコードはいいと思う。

106 :nobodyさん:05/02/05 10:31:05 ID:???
結局ココの奴もたいしたことない。

107 :nobodyさん:05/02/05 10:56:10 ID:???
>>106
。・゚・(ノД`)・゚・。

108 :nobodyさん:05/02/05 13:29:53 ID:???
>>106
大したこと無いのは俺とお前だけで、
他のみんなすげえよ!俺なんかすげえ人間が小さいの。

109 :nobodyさん:05/02/05 14:18:00 ID:???
実は考えてたんだけど、>>97さんに先を越されて出せなかったやつを出してみる。
三項演算子使いまくりなのはuse warnings対策。
中身はほぼ>>97さんと同じ。

my %sp = map{$_ => 1} qw(
quot amp lt gt

nbsp iexcl cent pound
curren yen brvbar sect uml copy ordf laquo
...
lceil rceil lfloor rfloor lang rang loz
spades clubs hearts diams
);

$text =~ s/&(?:(\w{2,8});)?/$1 ? ($sp{$1} ? "&$1;" : "&amp;$1;") : "&amp;"/ge;

110 :nobodyさん:05/02/05 14:28:42 ID:???
気の済むまでハッシュを手書きする仕組みはむしろメンテナンス性低いと思った。
Wikiでプラグインをコールするような用途に向いていている。

&amp;置換だけなら、よくある(?![\w\d]+;|#x?[A-Fa-f0-9]{1,6};)みたいので十分では。適当だけど。
全部羅列するならDTD依存で生成するから、コンパイラが吐いた長い正規表現でも、スクリプト生成の
でかいハッシュでも、保守性は変わらないかな。【代】

111 :nobodyさん:05/02/05 16:39:25 ID:???
どれだけ厳密なものが必要かは、分からないから。
完全にstrictなHTMLが必要なのかも知れ無いし。

ハッシュ作るのマンドクセなら、他のモジュールから借用する手もある。
内部の変数に依存しているから、使い捨てのスクリプト程度にしか使えないけどね。

use HTML::Entities;
...
$text =~ s/&(?:(\w{2,8});)?/$1 ? ($HTML::Entities::entity2char{$1} ? "&$1;" : "&$1;") : "&"/ge;

112 :nobodyさん:05/02/05 16:47:00 ID:???
>>50 をテンプレに入れとくべきだな。

113 :109=111:05/02/05 17:00:43 ID:???
>>112
たまたま忘れただけさ orz

$text =~ s/&(?:(\w{2,8});)?/$1 ? ($HTML::Entities::entity2char{$1} ? "&$1;" : "&amp;$1;") : "&amp;"/ge;

114 :nobodyさん:05/02/07 17:45:23 ID:???
DTDぶっこ抜きだから面倒臭さも保守性もかわらんという話だろ


115 :名無しさん@Vim%Chalice:05/02/07 18:32:59 ID:cdJVzA6k
Cのソースを追うことが多く、何の変数でもいいので
とにかく変数を検索するための正規表現を作りましたが
全然だメッス。↓が限界
\b[A-z_][A-z0-9_]*[\s]*?[^\(]

116 :名無しさん@Vim%Chalice:05/02/07 19:01:26 ID:cdJVzA6k
>>115
変数はつらいが、関数もしくはメソッドならこれだぜ!!
(?=.)(?!(if|while|for|switch))\<[A-z_][A-z0-9_]*?[\s]*?(?=\()

117 :nobodyさん:05/02/08 00:19:26 ID:aXE3qbDZ
はじめまして、
"【PHP】くだらねぇ質問はここに書き込みやがれpart3" から誘導されてきました。

HTMLソース内に記述されている画像ファイル名を抽出しようと四苦八苦しています。
画像ファイル名は相対パスで指定されており、「../../」の部分も一緒に抽出させたいのです。
検索条件をお教えいただけないでしょうか。

$html = HTMLソース;
eregi("xxxxxxxx", $html, $var);

-- このような結果が返ってくる --
 $var[0] == "../../aaa.jpg";
 $var[1] == "image/bbb.gif";
 ・
 ・
 ・

お力添えをお願い致します。


118 :nobodyさん:05/02/08 00:43:32 ID:???
>>117
preg_match_all('!<img .*src.*"(.+?)"!', $html, $var)

こういうやつとか?


119 :nobodyさん:05/02/08 07:52:30 ID:???
>>118
<img src='hoge.jpg'>
<img src=hoge.jpg>


120 :117:05/02/08 09:49:40 ID:9oMQzPoD
>>118
ありがとうございます!
マニュアルを見てみると、preg_match_all関数のほうが良さそうですね。
さりげなく教えていただき、大変感謝です。

あとは119で指摘されているクォーテーションマークの問題を
色々試して解決してみます。

あ〜正規表現を勉強しないと…(汗)

121 :nobodyさん:05/02/08 10:09:22 ID:???
便乗で質問です。
>>119の問題を回避するとしたらこんな感じでよろしいのでしょうか?

preg_match_all('!<img .*src=('|\")(.+?)('|\") .*>!', $html, $var)

122 :121:05/02/08 10:10:46 ID:???
間違えました
preg_match_all("!<img .*src=('|\")(.+?)('|\") .*>!", $html, $var)

です…


123 :nobodyさん:05/02/08 12:43:15 ID:???
駄目。つかテストしろ。

124 :nobodyさん:05/02/09 10:01:21 ID:???
<から>のタグの抽出を行っているんですが、
< >の中ににある ” ”または ’ ’の中にある > は無視したいんですが、
どうしたらよいでしょうか・・・。



125 :124:05/02/09 10:03:20 ID:clTgmqY1
あ、ちなみに、PHPのpreg_replace_callbackで
抽出しております。。
宜しくお願いします。


126 :nobodyさん:05/02/09 13:09:04 ID:???
>>124
こんなのとか。
'/<\w+(?:\s+(?:"[^\"]+"|\'[^\']+\'|[^"\'\>]+)+)?>/'

127 :nobodyさん:05/02/09 15:19:31 ID:???
>>126
ありがとうございます。
貼り付けてみたんですが、Parse errorになっちゃいました
何がまずいんでしょうか・・・

128 :nobodyさん:05/02/09 15:43:59 ID:???
>>127
ごめんなさい。それは私のミスでした。

129 :nobodyさん:05/02/09 18:24:51 ID:???
>>124
ベタ取得、"'でとめて引用符内を取得の1以上繰り返し

130 :nobodyさん:05/02/09 19:56:51 ID:???
>>124
'/<\/?\w+(?:\s+(?:(?:\w+\s*=\s*(["\']?).*\1)|noshade|selected|checked|multiple|noresize))*>/'
こんなとこで。
見落としありそうだけど。

131 :nobodyさん:05/02/09 20:13:34 ID:???
>>130
たとえば '<a a=><a>' とか '<a a=""><a a="">' とかでダメっぽい。

132 :130:05/02/09 20:47:31 ID:???
>>131
なるほど
'/<\/?\w+(?:\s+(?:(?:\w+\s*=\s*(["\']?).*?\1)|noshade|selected|checked|multiple|noresize))*>/'
とりあえず対応してみる。

133 :nobodyさん:05/02/10 16:49:24 ID:???
PHPにはタグを抜き取る関数があるだろ

134 :nobodyさん:05/02/10 16:51:05 ID:???
まじ?

135 :nobodyさん:05/02/10 17:02:07 ID:???
strip_tags
ttp://jp.php.net/manual/ja/function.strip-tags.php

136 :nobodyさん:05/02/10 17:38:07 ID:???
つか何でタグなのに引用府内に<>が入ってんの?

137 :136:05/02/10 17:43:29 ID:???
一行レスじゃ芸がないので代案
'/<(?:[^"\'>]*?|"[^"\\\\]*(?:\\\\.[^"\\\\]*)*")*>/'

>>132
<a href=">" />も

138 :nobodyさん:05/02/10 17:56:42 ID:???
<a href=">" >か<object data=">" />にしとけ。

139 :130:05/02/10 21:00:18 ID:???
>>137
ども、対応してみる。
'/<\/?\w+(?:\s+(?:(?:\w+\s*=\s*(["\']?).*\1)|noshade|selected|checked|multiple|noresize))*\s*\/?>/'

これはいかがですか。
<![INCLUDE CDATA [ >>> ]]>
<script><!-- if (a>c) --></script>

140 :nobodyさん:05/02/10 21:44:38 ID:???
>>139
これでダメみたい。
<a href=hoge>hoge</a>
hoge が消えちゃう。

'#</?\w+(?:\s+(?:\w+\s*=\s*(?:"[^"]*"|\'[^\']*\'|[^"\'>\s]*)|\w+))*\s*/?'.'>#i';

141 :nobodyさん:05/02/10 22:10:06 ID:???
JSPで入力された項目がメールアドレスであるかを
正規表現で調べたいんだけど、うまく動作してくれない。

メールアドレスの正規表現って、
^[a-z0-9][\\w\\.]*@[^\\.][\\w\\.]+[^\\.]$
でいいよね?

142 :nobodyさん:05/02/10 22:20:47 ID:???
>>141
とりあえずパッと見て気がついた点は、
[...] の中の '.' はエスケープしなくて良いのと、
ドメインにはハイフンもありうるけど \w にはハイフンは含まれない。

143 :130:05/02/10 23:09:13 ID:???
>>140
エンバグしてました orz
'/<\/?\w+(?:\s+(?:(?:\w+\s*=\s*(["\']?).*?\1)|noshade|selected|checked|multiple|noresize))*\s*\/?>/'

# ああ、もういいや。

144 :nobodyさん:05/02/10 23:13:25 ID:???
strictなHTMLだけを対象にすりゃええやん。
クォートなしの属性値はHTML4.01までならOKだから考慮する必要があるけど
実体参照になってない&<>"なんかは論外。

145 :nobodyさん:05/02/11 00:21:17 ID:???
パーサーかCC使ったほうが楽かもね。
<!CDATA[ <tag attr=""> ]]>

146 :nobodyさん:05/02/12 00:04:09 ID:???
グダグダだな

147 :130:05/02/12 08:02:28 ID:???
$html = '<\/?[\w\.]+(?:\s+(?:\w+\s*=\s*(?:\'[^\']*\'|"[^"]*"|[^>"\'\s]*)|\w*))*>';
$sgml = '<!(?:\[\s*(?:[\w\.]+|\%[^;]+;)\s*\[.*?\]\]|[\w\.]+(?:\s+(?:\'[^\']*\'|"[^"]*"|\[[^\]]\]*|[^"\'>\s]*))*)>';
$remark = '<!(?:\s*--(?:\'[^\']*\'|"[^"]*"|[^"\']*?)*--\s*)?>';
"/$remark|$sgml|$html/is"

グダグダついでに。
SGMLをマッチする方向に変更。
ショートタグの大部分、エンプティタグ、NET、一つのタグ内の複数の注釈は非対応。

148 :130:05/02/12 08:10:57 ID:???
ああ、また orz
$html = '<\/?[\w\.]+(?:\s+(?:\w+\s*=\s*(?:\'[^\']*\'|"[^"]*"|[^>"\'\s]*)|\w*))*\/?>';
でおながいします。

149 :nobodyさん:05/02/12 23:55:30 ID:???
教えてください。
数字が10個以上連続していない行をマッチさせたいんですが、
どのような正規表現を書けばいいでしょうか?

150 :nobodyさん:05/02/12 23:57:49 ID:???
↑あ、言語はPHPです...

151 :nobodyさん:05/02/13 00:19:32 ID:???
>>149
数字が10個以上連続している行を除外するのではだめでしょうか?

152 :nobodyさん:05/02/13 00:45:32 ID:???
>>149
直前に数字十個以上がない全ての文字の連続という正規表現を書けばいい
PCRE系ならMオプションをつけて行マッチさせろ

153 :149:05/02/13 00:51:12 ID:???
うー・・よくわかりません…
数字10個のものを除外するのでは、
意図していることと違っちゃうのでちょっとだめです。

154 :nobodyさん:05/02/13 01:05:37 ID:???
後ろに十個以上の数字を伴わない任意の文字、の連続
のほうが書きやすいか。

155 :nobodyさん:05/02/13 02:09:24 ID:???
分からんのは回答者のほう。お前の意図なんか知らんよ。エスパーじゃないし。
pcreなのかposixなのかも知らんし、どのくらい噛み砕けば理解できるのかも分からんし、
よく分からない、の「よく」がどの程度かも知らんし、データが複数行なのか単一行なのかも知らんし、
Gマッチなのか一個でいいのかも知らんし、正規表現書けるかどうかさえ知らんのだYO。

>>154
言葉からだといくつかパターンが考えられるけど、数字が続かない文字だと、
数字のみからなるデータで常に文末にマッチすることないか?
>>152のように否定言明を使って (?!\d{10,}). みたいにするしかないと思う。
後方言明だと可変長の正規表現を扱えないし、、、。

156 :155:05/02/13 02:19:44 ID:???
あれ、直前に?なんか解釈間違ったかも。
ともかく普通に否定言明にドットつなげばいけるよ。

157 :nobodyさん:05/02/13 17:13:27 ID:iVFDDmsL
php4なんですが、
ある文字列が、全角カタカナで50字以内かいなかは
どうやっってかけばいいのでしょうか?

158 :154:05/02/13 18:52:34 ID:???
>>155
あーそうかも。とりあえずパフォーマンスの悪い別解。激しくナンセンスだがw
/^(?(?!\d{10,}).*)$/

>>157
全角カナ換算で50文字以下なら、エンコード指定してmb_strcountか、strlenの結果を一文字の
バイト数で割って算出。
振り仮名などで対象がすべてカナであることも保障したい場合は、使用している文字コードの
全角カナのブロックをすべて文字クラス[]に放り込んで{,50}$を指定すれば、正規表現的にはOK。

159 :nobodyさん:05/02/13 18:57:00 ID:???
×mb_strcount
○mb_strlen


160 :nobodyさん:05/02/13 19:14:12 ID:???
PHP 使う奴は、まず pcre や mbstring の利用の可否を書いておくべし。

161 :nobodyさん:05/02/13 20:11:56 ID:???
perlの正規表現で、記号類はどのように表現すればよいですか?
やりたいことはUTF8で書かれた日本語の文章から、
> −-―・「」!'(),….『』´’~☆‐/?“”、!+。
> []:→〈〉&()←×‥♂〜#`℃@"‘*¨「」φ|【】; %
> =〔〕《》◇∞〓♯●\^◎°○★U♭?〃?\▲≪≫
などの記号類を全て取り除きたいのです。
EmEditorの正規表現では\Wでこれが実現できるのですが、
perlで\Wとすると・・・。

宜しくお願いします。

162 :nobodyさん:05/02/14 17:22:57 ID:SqkH/Xuz
>>124に近いのですが、HTMLにおけるリンク先の抽出に手間取ってます。
タグはとりあえず見ずに、srcとhrefの後ろの=から"か'をキャッチして対応する
"or'までを取得したいのですが。。。
言語はPHPです。

163 :nobodyさん:05/02/14 21:10:11 ID:???
>>161
perl5.8.1以降ならtr///が使える。
スクリプトもUTF-8で書かれていると仮定。
(\r\nは、マッチ文字列に改行が含まれていて、
改行コードが削除されてしまうための対策。不要なら削る。)

use encoding qw(utf8);

tr{\r\n
−-―・「」!'(),….『』´’~☆‐/?“”、!+。
[]:→〈〉&()←×‥♂〜#`℃@"‘*¨「」φ|【】; %
=〔〕《》◇∞〓♯●\^◎°○★U♭?〃?\▲≪≫
}{\r\n}d;

164 :nobodyさん:05/02/14 21:38:42 ID:KmG+pbP2
PHP環境なのですが、「半角記号にマッチ」というのを
シンプルにあらわす方法はないですか?

165 :nobodyさん:05/02/14 22:01:44 ID:???
>>164
[[:graph:]] とか

166 :nobodyさん:05/02/14 22:17:29 ID:???
>>165
thx!

167 :nobodyさん:05/02/15 02:50:04 ID:???
>>162
何が出来ないのか分からんが、上であがったのを流用すればいいだろう

168 :nobodyさん:05/02/16 16:27:58 ID:SLDSz7ZK
質問です。たとえば1〜20までの数字があって、
1と3の2つだけをマッチさせたいのですが、
/^[1|3]/
とすると、1、3はもちろんマッチするのですが、
11も12も13も・・・マッチしてしまいます。

この場合、どう書いたらいいのですか?

169 :nobodyさん:05/02/16 16:29:48 ID:???
/^[1|3]$/

170 :nobodyさん:05/02/16 18:09:46 ID:???
>>169
すみません、ソース晒します。phpです。

for($i = 1; $i <= 100; $i++) {
if(preg_match("/^[1|10|25|45|60]$/", $i)) {
echo $i."<br>";
}
}

この場合1、10、25、45、60がマッチして出力されるように
したいのですが、実際出力されるのは1、2、3、4、5、6と
なってしまいます。これを思い通りにマッチさせるのは
どうしたらいいのでしょうか?

171 :nobodyさん:05/02/16 18:43:47 ID:???
"/^(1|10|25|45|60)$/"

172 :nobodyさん:05/02/16 22:23:02 ID:???
htmltodatで、
<dt><a name=9>9</a> :<font color=green><b>名称未設定</b></font> :04/11/16 21:50:08 ID:VtVZWEIG<dd> てすと<br><br>
<dt><a name=8>8</a> :<a href=mailto:sage><b>名称未設定</b></a> :04/11/16 17:48:11 ID:nBSRrYU6<dd> てすと<br><br>

dat
名称未設定<><>4/11/16 21:50:08 ID:VtVZWEIG<>てすと<>
名称未設定<>sage<>1/16 17:48:11 ID:nBSRrYU6<>てすと<>

のようにしたいのですが、
m#<DT><A.*?>([0-9]+).+?<B>(?:<A HREF="mailto:(.+?)">)?(.*?)(?:</A>)?</B>.{11}(.*?)<DD>(.*)<BR><BR>#mi
この正規表現だと、どうしてもsage等のメール欄もマッチしてしまい、
名称未設定<>sage<>のようにdatに残りません。
(?:<A HREF="mailto:(.+?)">)?の部分は、A HREFが出現した時にだけマッチする
のだと思うのですが、その後の(.*?)が<font color=green>にマッチしている
部分なのでしょうか。

173 :nobodyさん:05/02/16 22:43:33 ID:???
すみません、解決しました。
m#<DT><A.*?>([0-9]+).+?(?:<A HREF=mailto:(.+?)>)?<B>(.*?)</B>(?:</A>|</FONT>) :(.*?)<DD>(.*)<BR><BR>#mi

174 :nobodyさん:05/02/17 02:06:18 ID:???
質問です。

HTMLのコメントタグを引っ掛けるにはどうしたらよいでしょうか?
単に引っ掛けるだけならできたのですが、例えば

<html><body>
<div id=" test<!--test ">a</div>-->
</body>
<html>

こんなのを引っ掛けないようにしたいんです。

175 :nobodyさん:05/02/17 02:44:37 ID:???
>>174
http://www.din.or.jp/~ohzaki/perl.htm#HTML_Tag

176 :nobodyさん:05/02/17 04:15:35 ID:???
コメントはタグじゃない・・・(ぼそ)

177 :174:05/02/17 11:15:34 ID:???
>175
回答ありがとうございます。そこの正規表現である
tag_regex = '<!(?:--(?:(?!--).)*--(?:(?!--)[^>])*)*(?:>|$(?!\n)|--.*$)';

を利用したのですが、

"<!--------------------------->foo"

となっていると文字列全部を取得してしまいます。(fooの前まで引っ掛けて欲しい)
これがコメントとして間違ってることは理解しています。
しかし、こういう具合に間違ってるWebページは結構多いので、
これもコメントとして認識したいのですが
どうにかならんものでしょうか?

178 :nobodyさん:05/02/17 11:34:14 ID:???
それがマッチする正規表現を新たに作ればよかろう
一回で全てしようとするから駄目なんだよ

179 :nobodyさん:05/02/17 13:37:18 ID:???
そもそも>>175のやつだと>>174のもとれないわけだが
これらに対応するのはキツイんじゃないかな
何回かに分けたとしても間違えてとったやつを弾くことは難しいわけで

180 :nobodyさん:05/02/18 04:21:47 ID:???
スキャナ書いた方が早道のような気もするね。

181 :nobodyさん:05/02/18 05:40:21 ID:???
適当にBNFで定義して終了

182 :nobodyさん:05/02/18 06:04:51 ID:???
>>174
Perlなら、>>147-148を利用して、
my $match = $str =~ m/($remark)|$sgml|$html/isg;

183 :nobodyさん:05/02/18 08:00:53 ID:???
>>182
my @match = $str =~ m/($remark)|$sgml|$html/isg;
だった…。

184 :nobodyさん:05/02/18 12:08:09 ID:4JcRNkuB
wakaru^-^

185 :nobodyさん:05/02/18 12:09:11 ID:???
↑miss...

186 :nobodyさん:05/02/18 15:39:39 ID:???
>>181
XML はともかく、 HTML で BNF 定義しようと思ったら地獄を見るような気もしなくはない。

187 :nobodyさん:05/02/19 16:48:15 ID:???
あんた、地獄を見るわよ

188 :nobodyさん:05/02/19 16:56:01 ID:???
>>179
たとえばどんな奴とか?

189 :nobodyさん:05/02/21 20:38:23 ID:???
RedirectMatchで半角スペース「%20」を-に変えるにはどうすればよいでしょうか?

RedirectMatch permanent (.*)\x20(.*) $1-$2
RedirectMatch permanent (.*)%20(.*) $1-$2
RedirectMatch permanent (.*)'%20'(.*) $1-$2
RedirectMatch permanent (.*)\x20(.*) $1_$2
RedirectMatch permanent "(.*) (.*)" $1-$2

全部だめ orz

190 :nobodyさん:05/02/21 21:38:35 ID:???
>>189
最後のでいけたぞ?

191 :nobodyさん:05/02/21 21:55:19 ID:???
>>190
いけました・・・
ありがとうございました

多分ブラウザのキャッシュか、.htacessに書く時点で間違えていたか、
どっちかだったと思います

192 :nobodyさん:05/02/22 17:24:46 ID:???
perl5.8です
1〜685の数字にマッチするように

6[0-8][0-5]|[1-5]\d\d|[1-9]\d|[1-9]

としてみたのですが、スマートというか
模範となるような書き方があったら教えてください

193 :nobodyさん:05/02/22 18:33:44 ID:???
>>192
その正規表現が間違ってるのはともかくとして、
全部正規表現でやろうとせず、
文字列としての評価は [1-9]\d* くらいで検査しておいて、
あとは数値的に評価した方が良いと思われ。

194 :nobodyさん:05/02/23 05:20:38 ID:Vw9LlCLC
ruby-1.8.2で、mixiの友達リストを取得するスクリプトを書いてます
ID番号などは、半角数字というのもあって、簡単に取得できたのですが、
名前取得で手こずっています。

<td>名無しさん(17)<br><a href=show_friend.pl?id=774>
^^^^^^^^^^
を取得したいと思っています。

上記にマッチする正規表現例を教えていただけないでしょうか?

\<td\>(.*)さん\([0-9]+\)
これでは取得できていません。


195 :nobodyさん:05/02/23 05:35:47 ID:???
申し訳ありません。。。取得できました。
rubyの文法を間違えていました。

ごめんなさいごめんなさい。。。
ちなみに上記の正規表現でOKでした。


196 :nobodyさん:05/02/25 22:30:13 ID:qCTUQzjg
文字列から半角英数字以外は全部取りたいんですが、正規表現で一発で表現できますか?

197 :196:05/02/25 23:02:07 ID:qCTUQzjg
↓こんなふうにしてみましたが、ダメでした。

ereg_replace( "/[^a-zA-Z0-9\s]/", "", $t )

何か勘違いしているでしょうか?

198 :nobodyさん:05/02/26 01:29:40 ID:EGev6g90
文字列クラスを定義して終わってるから何にもマッチしないと思うけど。

199 :nobodyさん:05/02/26 01:31:43 ID:EGev6g90
文字クラスだった。

200 :nobodyさん:05/02/26 06:16:34 ID:???
>>197
preg_replace()ならだいじょうび。

201 :nobodyさん:05/02/26 06:37:59 ID:???
>>197
$t = ereg_replace("[^a-zA-Z0-9\s]", "", $t);

こういうこと?
それから、日本語扱うならmb関数にする。

202 :nobodyさん:05/02/26 17:50:17 ID:LErwwWXI
半角英数文字列が入っている変数$fooと$barについて
大文字、小文字を区別無くマッチさせたいのですが、どうやればいいんでしょうか?
言語はPerlです。

$foo="123test@2ch.ne.jp";
$bar="123TEST@2ch.ne.jp";
このようなものが入っている場合、マッチさせたいのです。

203 :nobodyさん:05/02/26 18:05:57 ID:???
>>202
i オプションで。 /^123test\@example\.ne\.jp$/i みたいな。

204 :nobodyさん:05/03/02 04:35:55 ID:???
↓こういう文字列を
  "あいうえお「かきくけこ「さしすせそ「たちつてと」なにぬねの」はひふへほ」まみむめも」やゆよ「らりるれろ「「わをん"
↓こんな感じに
  "あいうえお<em>かきくけこ<em>さしすせそ<em>たちつてと</em>なにぬねの</em>はひふへほ</em>まみむめも」やゆよ「らりるれろ「「わをん"
変換したいんですけど、どうすればいいんでしょう?

イメージ的には
  /「[^「]*?」/
こういうことをしたいんだけど、[ ] の中はアスキーだけだし。
use encoding とかはナシな方向でひとつ。

205 :204:05/03/02 04:49:22 ID:???
いまんとこ
-------------------------
my ($s, $t) = (quotemeta '「', quotemeta '」');
$_ = "あいう〜";
s/($s)/\a$1/og;
while (s/ \a $s ([^\a]*?) $t /<em>$1<\/em>/ogx) { 1; }
-------------------------
とか 「 \a 」 で印つけてるけど、他にもいい方法あるかと思って。

206 :nobodyさん:05/03/02 11:34:17 ID:???
>>204
私がやるとすればPerlメモ(ttp://www.din.or.jp/~ohzaki/perl.htm)にある
例を利用してあらかじめ

$ascii = '[\x00-\x7F]';
$twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]';
$threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]';
$char = qr{(?:$ascii|$twoBytes|$threeBytes)};

$eucpre = qr{(?<!\x8F)};
$eucpost = qr{
(?=
(?:[\xA1-\xFE][\xA1-\xFE])* # JIS X 0208 が 0文字以上続いて
(?:[\x00-\x7F\x8E\x8F]|\z) # ASCII, SS2, SS3 または終端
)
}x;

を用意しておいて、

1 while s{$eucpre(?:「((?:(?!「)$char)*?)」)$eucpost}{<em>$1</em>}o;

てな感じかな。キモは

[^」]を実現するのに、否定先読み+ASCIIまたはEUC1文字にマッチするパターンを使用
全体が1バイトずれてマッチしないように$eucpre,$eucpostを前後につけた

というあたりです。



207 :nobodyさん:05/03/02 13:53:48 ID:???
PHPを使ってます。
タグの外にあるカタカナと『ー』の前後に半角スペースを入れたいのですが
(文字コードはEUC)

$t = preg_replace("/(?:^|(?<=>))([^<]*)((?:\xA5[\xA0-\xFF]|\xA1\xBC)+)/i","$1 $2",$t);

のようにすると、
例えば『七時のニュースです』という文字列の場合『ス』の前後にしか空白が入ってくれません。
どうにかして解決できないでしょうか……

208 :204:05/03/02 17:36:49 ID:???
>>206
わー、ありがとう!
答えだけじゃなく、技術的にも勉強になったよ THX!

209 :nobodyさん:05/03/02 19:46:42 ID:???
>>207
ここはおまえのバカっぷりを晒すとこじゃないぞ。出直してこい。

210 :nobodyさん:05/03/02 22:15:55 ID:???
PHPを使っており、file関数でHTMLを読み込んで
指定部分だけを抜き出したいと思っています。

HTMLには<!-- BEGIN -->〜〜〜〜<!-- END -->というような
コメントが入っており、その中身だけを抽出したいと思っております。

まずfile関数で配列にすべてのHTMLを格納しimplideで結合します。

テスト用に以下のものを試しました。


$pattern = "/<!-- BEGIN -->(.*?)<!-- END -->/";

$ary_data[] = "<!-- BEGIN -->\n";
$ary_data[] = "あいうえお\n";
$ary_data[] = "<!-- END -->\n";

$str_data = implode("", $ary_data);

preg_match($pattern, $str_data, $matches);

echo $matches[0];


改行コードが入っているとうまく抽出してくれません。

.*?の部分を[.\s]*?に変えてみたのですが変化がありませんでした。
どのように変更を加えればよいのでしょうか?

211 :207:05/03/02 22:24:58 ID:???
ごめん、俺が馬鹿だった。出直してくる。解決したけど。

212 :nobodyさん:05/03/03 10:12:04 ID:???
>>210
$pattern = "/<!-- BEGIN -->(.*?)<!-- END -->/s";
パターン修飾子 s をつけることで . が改行にもマッチするようになります。

213 :nobodyさん:05/03/03 13:52:50 ID:???
>>212

あ〜〜〜そんないいものがあったんですね。
どうもありがとうございました

214 :nobodyさん:05/03/03 14:08:03 ID:zkHMOcKe
----で囲まれた文字列にマッチしたら、そのマッチした文字列を取得したあと
その文字列を別の文字列に置換するということをphpでやりたいのですが

$data = "aiu----hello----ncka";
$pattern = "/----(.*?)----/";

preg_match($pattern, $data, $out);

$data = preg_replace($pattern, "----goodbye----", $data, 1);


こうすると$out[1]にはhelloが入り、もとのデータ$dataの
----hello----が----goodbye----に置換されるというようにしているのですが、

同じ部分を検索しているのにもかかわらず
preg_matchとpreg_replaceを使っているので、もう少しいっぺんに同じ動作を
させることはできるでしょうか?

215 :nobodyさん:05/03/04 20:58:51 ID:gtJy+aSQ
入力された身長体重が正しいかを判別したいんだけど...

^(?:d+(?:.d*)?|.d+)$

と考えたけど、うまくいきません。

エロイ人、添削キボン


216 :nobodyさん:05/03/04 22:28:59 ID:???
>>215
まずどういうのが正しいのかを示すべき。

217 :nobodyさん:05/03/05 05:18:05 ID:???
/+。:.゚ヽ(*´∀`)ノ゚.:。+゚/i

218 :nobodyさん:05/03/05 08:15:13 ID:8nW34nzC
>>216
170
175.5
60
60.5
がOKで、
.6
15.15.52
なんてのがボツ
もちろん、数字と.以外がはいるとボツ

>>217
エラーになりますた

219 :nobodyさん:05/03/05 08:36:43 ID:???
>>215
正規表現のスレでいうのもあれなんだが
数字として比較したほうがわかりやすいと思う
if ($height < 130 || $height > 200) print "Error";

220 :nobodyさん:05/03/05 12:19:51 ID:hbhM7+40
$string = "12.3.45";

$pattern = "/^[0-9]+?\.[0-9]+$|^[0-9]+$/s";

if (preg_match($pattern, $string)) {
echo "正常です";
} else {
echo "違います";
}


221 :nobodyさん:05/03/05 12:22:32 ID:???
$string = "12.3.45";

$pattern = "/^[\d]+?\.[\d]+$|^[\d]+$/";

if (preg_match($pattern, $string)) {
echo "正常です";
} else {
echo "違います";
}


222 :nobodyさん:05/03/05 12:26:53 ID:OYa1FD+r
ぽちぽちドットコム:キャッシュバック100円から!
http://pochi-pochi.com/pages/index.php?refid=hopedkco

223 :nobodyさん:05/03/05 13:35:01 ID:???
<?php
$string = "12.3.45";

$pattern = "/^\d+?\.\d+$|^\d+$/";

if (preg_match($pattern, $string)) {
echo "正常です";
} else {
echo "違います";
}
?>

224 :nobodyさん:05/03/05 19:27:01 ID:???
$pattern = "/^\d+\.\d+$|^\d+$/";


225 :nobodyさん:05/03/05 20:43:45 ID:???
/^\d+(\.\d+)?$/

226 :偽崎 博基:05/03/05 21:42:08 ID:???
改行で終わっていた場合にも正常とみなされる記述は"間違い"です.

227 :nobodyさん:05/03/05 22:40:51 ID:???
>>226
/^\d+(\.\d+)?\z/

228 :nobodyさん:05/03/07 05:11:36 ID:DaphPIkI
----------------------------------------------------
http://www.abc.ne.jp/abc/abc.htmゴッゴル
コメント
http://www.nurupo.ne.jp/null/def.htm
ホゲホゲ
ホゲホゲ
ゲゲボ
http://www.g00.ne.jp/gero/ghijkl.htmまんくるぽ
ぬるぽ
http://www.mahoo.ne.jp/abc/mnopqrstu.htm
----------------------------------------------------

↑の文章がテキストに記述されてるとして、
「正規表現で置換を行いURL以外を削除する」
若しくは
「URLだけを抜き出す」
にはどうすればいいですか?
K2Editor と bregexp.dll を使用しています。

229 :nobodyさん:05/03/07 12:11:56 ID:???
>>226
なんか偉そうだな

230 :ひろやん:05/03/07 19:30:39 ID:???
>>229
そんなあなたにPerlメモ

231 :nobodyさん:05/03/08 13:16:24 ID:???
>>228
>>26

232 :nobodyさん:05/03/10 10:04:14 ID:Oal+cA17
ファイル内文字列置き換えツールのSpeeeeedを使っている方
います?
他にどこできいていいものやらわからないので・・・。
Tepaエディターの正規表現でヒットする文字列がヒットしないんですけど、
具体的には
...:..:...ID:........$
という検索文字列を文字なしで置き換え、2chのスレッド内発言の時間とIDを削除しようとしています。
今日初めて正規表現のことを知って、美しくない検索かもしれませんが・・・。
と書きつつも231さんのIDがID:???であることを知った。
初めて見ました。
よろしくお願いします。

補足
BREGEXP.DLLを導入して、Speeeeedから正規表現が扱える状態になっています。

233 :nobodyさん:05/03/10 10:07:14 ID:???
>>232
>>1のリンク先読んでから来てね。

234 :nobodyさん:05/03/10 10:25:23 ID:Oal+cA17
Speeeeedを使っている人はいないということを
おっしゃりたいのでしょうか?
勉強してからこいとおっしゃりたい?

235 :nobodyさん:05/03/10 12:22:03 ID:???
俺には「>>1のリンク先を読んでから来い」としか読めないのだがな。

236 :nobodyさん:05/03/10 14:06:21 ID:???
>>232
Speeeeed のホームページのサポート掲示板を「行末」とかで検索してみたら、
改行の扱いがどうもいまいちみたいね。
...:..:...ID:........\r\n
ってなかんじでどうでしょ。

237 :nobodyさん:05/03/10 23:52:18 ID:???
>>236
ありがとうございます。
それでいけました。

>>235
正規表現が使える他のエディタではうまくいくので、
Speeeed固有の問題だと考えたけれど、>>1のリンク先には
その回答がなかったので・・・。

スレよごしすいませんでした。

238 :nobodyさん:05/03/13 23:43:38 ID:d9JNVB9S
PHP環境で、テキストからURLだけを抜き出そうと思っているのですが、
---
$txt = "mae http://hoge.jp mannaka http://abc.jp ushiro";
preg_match("/(http:\/\/[\w;\/\?:\@&=\+\$,\-\.!^\*'\(\)%#]+)/", $txt, $matches);
foreach ($matches as $tmp) {
   echo $tmp."\n";
}
---
とすると、
---
http://hoge.jp
http://hoge.jp
---
となってしまいます。
http://hoge.jphttp://abc.jpを抜き出すためにはどうしたらよいのでしょうか?

239 :nobodyさん:05/03/14 00:19:26 ID:???
>>238
http://jp.php.net/manual/ja/function.preg-match-all.php

240 :238:05/03/14 00:36:40 ID:???
>>239
ども。出来るようになりました。

241 :nobodyさん:05/03/18 12:51:02 ID:nYSabF1K
質問です。
メールを処理するCGIをPerlで作っているのですが、ヘッダ部の
Subject:xxxxxx
を抜き出す方法がわかりません。

メールをヘッダ部とbody部に分け
if ($m_header =~/Subject:\s*(.*)/i){
  $m_subject = $1;
}
だと、件名が長いときは切り落とされてしまいます。

Subject: =?ISO-2022-JP?B?GyRCPzclMyE8JUohPDMrO08hIzBsSmJAaCRyGyhC?= ←ここではなく
 =?ISO-2022-JP?B?GyRCO0UzXSQxJGs0azZIJCskaSEiN1AxRCROGyhC?=
 =?ISO-2022-JP?B?GyRCS1w8QSRyJEQkKyRgGyhCIChCeSBORUMgMjAwNS8yLzIxKQ==?= ←ここまでマッチさせたい

ttp://www110.kir.jp/study/jissen/script2130.html
の「タイトルの抽出」部分にある/MIME/文字列の$`だと、相手のメーラーに
よってはIn-Reply-ToやReferencesやMessage-Idなども件名に入ってしまい
うまくありません・・・。




242 :nobodyさん:05/03/18 14:01:29 ID:uLSanIIA
$m_header=~ /[\x0D\x0A]+Subject:\s*([^=\x0D\x0A]+|(?:=.+?=\s+)+)/is;

243 :nobodyさん:05/03/18 14:40:54 ID:???
>>241
$m_header =~/^Subject: *(.+\x0D?\x0A(?: .+\x0D?\x0A)*)/im;

普通はモジュール使うけど。
use Mail::Header;
my $head = Mail::Header->new(\*STDIN);
print $head->get('Subject');

244 :241:05/03/18 18:00:07 ID:R05cZtNs
>>242
>>243
ありがとうございましたっ!!
242でも243でもできました。感謝です。


>>243
Mailで始まるモジュール、1つも入ってないのです・・・
・・・

245 :nobodyさん:05/03/18 18:38:54 ID:???
一応指摘しとくけど、 >>242 はあかんやろ。

246 :nobodyさん:05/03/18 20:11:42 ID:???
>>245
どこがいけないか指摘しないと指摘にならんよ

247 :nobodyさん:05/03/19 01:20:39 ID:???
>>246
そこまでしなきゃわかんないアマちゃんなのかよ!!!

$m_header = "Subject: =?ISO-2022-JP?B?GyRCJCIbKEI=?=\n =?ISO-2022-JP?B?GyRCJFsbKEI=?=\n";
$m_header = "Content-Type: text/plain\n Subject: foo\n bar\n";

248 :nobodyさん:05/03/19 01:50:04 ID:???
ぼうやだからさ!

249 :nobodyさん:05/03/19 03:53:17 ID:RErqV7fD
name="*********"

すべての文字列の中から上の中の*********だけを取り出すことはできますか?
*は任意の文字列で、文字数も自由です。


250 :nobodyさん:05/03/19 04:02:03 ID:???
>>249
できる。

251 :nobodyさん:05/03/19 13:23:37 ID:???
>>249
不可能

252 :nobodyさん:05/03/19 14:37:12 ID:frwLr80o
できた

253 :nobodyさん:05/03/19 16:05:41 ID:???
責任とってよ!

254 :nobodyさん:05/03/19 18:00:42 ID:???
おろせよ

255 :nobodyさん:05/03/19 18:15:41 ID:???
ひとでなし!

256 :nobodyさん:05/03/19 19:58:20 ID:???
ホントにおれの子か?

257 :nobodyさん:05/03/19 22:11:06 ID:???
まけぼのと角田師範の愛の結晶

258 :nobodyさん:2005/03/21(月) 12:03:14 ID:???
Perl です。
いろんな形の <br><br/><BR /> などなどを
<br /> に統一したい。どうしたらいいですか!?
<[Bb][Rr]*(\\)>

259 :T女の竹田:2005/03/21(月) 12:19:14 ID:???
s{<br( /)?>}"<br />"sgi
でどう?

<br clear="left">とかも入れるなら
s{<br[^>]*>}"<br />"sgi
かな。

260 :T女の竹田:2005/03/21(月) 12:21:11 ID:???
あ、上のは
s{<br( ?/)?>}'<br />'sgi
のほうがいいかな

261 :nobodyさん:2005/03/21(月) 13:54:11 ID:???
<[Bb][Rr]*(\\)>
↑ これは一体何をしたかったのだろう・・・。

んじゃ
s!<br(?>[^<>]*)>!<br />!igs;

ところで、 i g s m x e o とかのオプションって、書く順番とか決めてる?
どの順番がわかりやすいんだろうなー。

262 :nobodyさん:2005/03/21(月) 13:56:12 ID:???
よく考えたら s オプションいらんやんw >>259-261

263 :T女の竹田:2005/03/21(月) 14:39:41 ID:???
sは習慣的につけてるなぁ
順番はsgieの順だな、他は使ったことがほとんどない

65 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)