トップページ⇒php
825コメント240KB

正規表現道場@2ch Part2

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/11/24 22:57ID:LrbVcl3Y
Perlに限らずスクリプト系言語で大活躍の正規表現。
このスレは有用そうな正規表現を紹介したり、どう表現したらいいかわからないときに
質問をしたりするためのスレッドです。
質問するときは使用言語や得たい結果をなるべく詳しく書きましょう。

リンクなどは>>2-5のあたりに。
0002nobodyさん02/11/24 22:58ID:???
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
0003nobodyさん02/11/24 23:00ID:???
前スレ
正規表現道場@2ch
http://pc.2ch.net/test/read.cgi/php/996105815/
0004nobodyさん02/11/25 00:15ID:oyWFxt5H
パターン集みたいなのは無いですか?
コード書く度に思い出すはめんどい。ていうか忘れてる。
0005あぼーんNGNG
あぼーん
0006Name_Not_Found02/11/29 22:13ID:/ULd/3Z0
age
0007nobodyさん02/12/05 05:07ID:5X+JpwfG
perlのcgiですけど、正規表現の置換でこれを含む語は置換したくないっていう時は
どうやるんでしょうか?
例えばテキスト中の「パーマン」は全部「プーヤン」に置換したいんだけど、
「パーマン3号」だけはスルーする、という風にするには。

一度全部「プーヤン」に変換してから「プーヤン3号」から「3号」を取る、
という方法しかないんでしょうか?お願いします。
0008nobodyさん02/12/05 05:28ID:???
>>7
こうかな。
$str =~ s/パーマン(?!3号)/プーヤン/g;
0009nobodyさん02/12/05 06:15ID:5X+JpwfG
ありがとうございます、でも駄目でした、、、(;´Д`)

やりたいことは掲示板にurlを書くと自動リンクになるようにしたいんですけど、
後で修正しようとすると先ほど自動で貼ったアンカータグの中のurlも、
そのアンカータグで囲まれたurlにも再度アンカータグを貼ってしまいます。
(?!3号)みたいにして括弧で囲んで?!を付ければ無視されるのかなと思い、
$comment =~ s/(?!<a href=\")(https?|ftp|gopher|telnet|whois|news)\:([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)(?!<\/a>)/<a href=\"$1\:$2\" target=\"_blank\">$1\:$2<\/a>/ig;
としてみたのですが無理でした。
説明不足ですいません。
0010Name_Not_Found02/12/05 06:32ID:???
修正するときって普通元データを弄るんじゃないのかね?
0011nobodyさん02/12/05 07:02ID:5X+JpwfG
そうです、元データをテキストエリアに読み込んでくるんです。
それを修正します。
0012nobodyさん02/12/05 07:44ID:???
>>10
すいません、質問の意味がわかりました。
cgiで表示させるだけなら、その時にだけ自動リンクを使えばいいですよね、
でも一日ずつhtmlファイルで保存してそれを読み込んでくるタイプなので、
元ファイルにすでにアンカーが貼られてるんですよ。
だからそれを修正しなければならない、とこういうわけです。
掲示板というよりニュースサイトのようなものを作ってます。
00131202/12/05 07:47ID:???
間違った。

× アンカー
○ <a href=""></a>
0014Name_Not_Found02/12/05 08:16ID:0NYAnUxi
というと、こんな感じの運用?

一日目:
これすごい http://www.aaa.com/article.pl?id=11

二日目:
<a href="http://www.aaa.com/article.pl?id=11">これすごい</a>
もっとすごいの発見 http://def.ghi.com/?bbs=a

三日目:
<a href="http://www.aaa.com/article.pl?id=11">これすごい</a>
<a href="http://def.ghi.com/?bbs=a">もっとすごいの発見</a>
....

以前の記事を修正しないなら、
追加分の生データだけパースして html に追加してく処理考えたほうがいいと思う。

で、アンカータグの中身、というよりタグの中身を処理対象外にする方法は
http://www.din.or.jp/~ohzaki/regex.htm を参照。
00151202/12/05 10:00ID:5X+JpwfG
>14
ありがとうございます、やりたかったのは確かにそんな感じです。
正確には、

一日目
これすごい http://www.aaa.com/article.pl?id=11

二日目:
これすごい <a href="http://www.aaa.com/article.pl?id=11">http://www.aaa.com/article.pl?id=11<;/a>
もっとすごいの発見 http://def.ghi.com/?bbs=a

といった感じです。
で、その大崎さんという方のサイトを見て修正したのですが、
確かにタグの中のurlはそのままになったんですが、タグに囲まれたurlの方が
修正するたびに二重に<a href></a>で囲まれていきます(;´Д`)。
<a href>と</a>の間にあるもの以外を全て置換しろ、という正規表現が書ければいいのですが
自分の力量ではとても、、、。
難しいです。
00161202/12/05 10:05ID:???
あれ?何か二日目に余計な&lt;/a&gt;っていうのがついちゃった。
0017nobodyさん02/12/05 10:20ID:???
s/(?<![">])(https?|ftp|gopher|telnet|whois|news)\:([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)(?!["<])/<a href=\"$1\:$2\" target=\"_blank\">$1\:$2<\/a>/ig;
0018Name_Not_Found02/12/05 10:45ID:0NYAnUxi
>>15
それはもう処理の内容を考え直した方がいいと思われ。
基本的に追加なんだろうし。
html をこんな風にして、

<!-- news here -->
これすごい <a href="...">...</a>

で、追加分を html に変換後、
出力ファイルの <!-- news here --> をサーチして追加分をそこに足す、
みたいなやりかたはどう?

過去記事も頻繁に修正する可能性があるなら元データを残すやり方にするべき。
もっとも、リクエスト毎に html に変換するんではなく、
スタティックな html をあらかじめ作っておくってやり方はそのままでいいと思う。
0019Name_Not_Found02/12/05 10:48ID:???
実際、複雑すぎる正規表現は速度とメンテナンス性を低下させるし。

0020nobodyさん02/12/05 17:44ID:???
>17
それじゃ<br>が入ってる場合は最初の行しか置換されないし、
その最初の行も最後の一文字が無視される罠。
00211202/12/05 19:13ID:5X+JpwfG
すいません、遅れました。
今17さんのでやってみたのですが、確かに20さんがおっしゃるような結果が出てしまいました。
あと、メールアドレスが置換されないみたいです。

>15
まさにそのやり方です、<!-- news here -->のようなコメントをサーチする。
ただ、僕は修正がすごく多いです、、、。
元データを残すやり方は、人様のスクリプトを改良してるので
一からやり直しになるし、またバージョンアップ版が出た時の互換性とか考えると
ツライですねぇ。
もちろん、著作権表示と改造表示は出してます。
00221202/12/05 19:37ID:???
失礼、>15ではなくて>18でした
0023nobodyさん02/12/06 00:05ID:0LEQc9+/
>>12
とりあえず10分ほどやってみたが出来なかった、
ウチの上司なら出来ると思うが昨日から出張‥‥
0024nobodyさん02/12/06 00:14ID:???
未だに意味がわからねぇw

一旦アンカータグ消せばいいんジャネーノ?的外れ?
0025nobodyさん02/12/06 00:40ID:???
>>24
修正用のテキストエリアに読み込む時に、元ファイルが例えば

<a href="http://www.yahoo.co.jp/">http://www.yahoo.co.jp/<;/a>

こういうのばっかだったらそれでいいかも知れんが、実際は

<a href="http://www.yahoo.co.jp/">これヤフー</a>

みたいのも混ざってるってことでしょ。
0026nobodyさん02/12/06 00:42ID:???
2chだせぇ
0027Name_Not_Found02/12/06 03:26ID:N6C9SdnH
じゃあ、こうするのは?
追加と修正は別フェイズにするの。

修正時は余計な変換処理無しで html を直接弄って、
追加の時は追加分だけ変換処理して <!-- news here --> につっこむの。

ただ、直接 html 弄れるフォームがあるってのは
心理的に好きじゃないなぁ。

なんだか正規表現と関係なくなってきたなぁ…
0028nobodyさん02/12/06 05:06ID:???
すいません、もともと正規表現についてはよくわからなかったので、とりあえず
「変数$newsの中から、アンカータグの中のものと、アンカータグに囲まれた部分は
無視してそれ以外を置換する」
ということがサクっと簡単に出来るものだと思ってました。
長く引っ張ってしまって申し訳ないです、正規表現、一から出直して勉強してきます。
0029nobodyさん02/12/06 12:37ID:???
$msg =~s{<a href="<a href=".*?">(.*?)</a>">}{<a href="$1">}g;
$msg =~s{<a href=".*?"><a href=".*?">(.*?)</a></a>}{<a href="$1">$1</a>}g;
0030Name_Not_Found02/12/06 14:31ID:???
>>29
そういう処理しなきゃいけない状況が不毛なんだってば。
0031nobodyさん02/12/06 16:16ID:???
>>21
全部一から自分で作ればいいじゃん。
0032nobodyさん02/12/06 16:19ID:???
>>30
質問に答えて何か問題があるのか?
0033Name_Not_Found02/12/07 04:46ID:705rdiGC
>>32
おばかなプログラムが増えていく状況を助長してはいけません。
「ライトついてますか?」でも読んでくれ。
0034nobodyさん02/12/07 07:33ID:???
>>33 あっそ。死ねよ。
0035Name_Not_Found02/12/07 11:04ID:???
>>34 幼いね。
0036nobodyさん02/12/08 12:52ID:???
オリジナルタグみたいなモノを使えるようにしているのですが

<code></code>で囲んだ間は、オリジナルタグを無効になるように処理したいです。
でも、<code>〜</code>〜</code>こういう風に書かれたら
途中で終わってしまて困ってます。

どうしたら良いでしょうか?
0037nobodyさん02/12/08 12:59ID:???
>>36
オリジナルタグってなに?

無効にするってどうすることを無効とするの?
00383602/12/08 13:40ID:???
すみません、説明不足でした。

簡単に言うと、
<code>〜</code>hogehoge</code>
これを
<blockquote>〜</code>hogehoge</blockquote>
こうやって置き換えをしたいのですが、

<blockquote>〜</blockquote>hogehoge</code>
になってしまいます。

s/<code>(.*?)<\/code>/i;
$t =$1;
$t =~ /</&lt/i;
$t =~ />/&gt/i;
s/<code>(.*?)<\/code>/<blockquote>$t</blockquote>/i;

ソースはこんな感じです。どうしたらいいでしょう…
0039nobodyさん02/12/08 14:16ID:???
>>36
>こういう風に書かれたら
っていうことはユーザーの入力を処理するってこと?
それならまずタグの閉じ忘れチェックをすればいいんじゃないかな。
00403702/12/08 15:01ID:???
@conv{qw(< >)}= ('<', '>');
s#<code>(.*)</code>#'<blockquote>'.(($_=$1)=~s/(<|>)/$conv{$1}/g,$_).'</blockquote>'#e;
00413702/12/08 15:03ID:???
しっ、失敗・・・ りとらい

@conv{qw(< >)}= ('&lt;', '&gt;');
s#<code>(.*)</code>#'<blockquote>'.(($_=$1)=~s/(<|>)/$conv{$1}/g,$_).'</blockquote>'#e;
0042nobodyさん02/12/08 15:05ID:???
$t = '<code>〜</code>hogehoge</code>';
$t =~ s/<code>(.*)<\/code>/<blockquote>$1<\/blockquote>/i;
print $t ;

これでどうよ?
0043nobodyさん02/12/08 15:09ID:???
あ、<と>も置換するのね。
その辺は適当に読み直してくれといいつつ書いてみる。。

$t = '<code>〜</code>hogehoge</code>';

$t =~ /</</i;
$t =~ />/>/i;
$t =~ s/<code>(.*)<\/code>/<blockquote>$1<\/blockquote>/i;
print $t ;

間違ってたらごめんよ。
0044nobodyさん02/12/08 15:13ID:???
$t = '<code>〜</code>hogehoge</code>';

$t =~ /</&lt;/g;
$t =~ />/&gt;/g;
$t =~ s/&lt;code&gt;(.*)&lt;\/code&gt;/<blockquote>$1<\/blockquote>/i;

痛いな、漏れ。
0045Name_Not_Found02/12/08 17:44ID:cySwFV0O
<code>あああ</code>ほげ<code>ほげ</code>ふがふが</code>
とかの場合、どこからどこまでが blockquote?

どういうシチュエーションなのかよくわからんちん。
textarea に書き込まれた文字を処理するのか
テンプレートファイルでの処理用のタグを導入してるのか…
■ このスレッドは過去ログ倉庫に格納されています