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

正規表現道場@2ch Part2

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

リンクなどは>>2-5のあたりに。
0598nobodyさん03/06/22 04:17ID:???
PHPじゃないんだが。。。

<a\s[^>]*?href="((https?|ftp):\/\/[-!\#\$%&'()*+,.\/:;=?\@~\w]+)"[^>]*?>([\s\S]+?)<\/a>
059959703/06/22 04:51ID:???
>>598
ありがとうございます。
できれば下のに対応できるくらい柔軟なものってできませんか?


<a href="http://www.aaa.aaa">通常リンク</a>
<A HREF"http://www.aaa.aaa">タグが大文字</a>
<a href=http://www.aaa.aaa>;クォート無し</a>
<a href='http://www.aaa.aaa'>;ダブルクォートの代わりにシングルクォート</a>
<a href="./test.html">省略リンク</a>
<a href="ftp://www.aaa.aaa">ftp通常リンク</a>
<a href="https://www.aaa.aaa">https通常リンク</a>
<a href = "http://www.aaa.aaa">イコールをスペースで囲む</a>
< a href="http://www.aaa.aaa">aをスペースで囲む</a>
<a href="http://www.aaa.aaa" aaa="aaa">他要素がある</a>
<a href="http://www.aaa.aaa"><b>他のタグもリンク</b></a>
<a     href="http://www.aaa.aaa">aとhrefの間が長い</a>

(最後はわかりやすいよう全角スペースにしてます)
0600nobodyさん03/06/22 08:54ID:???
>>599
テストしながら自分で改良しろよ…ヤレヤレ…
0601nobodyさん03/06/22 10:40ID:???
>>599
HTMLの仕様から考えると「考えなくて良い」ものもあるが
それにも対応すると?
0602nobodyさん03/06/22 11:09ID:???
>>599
そういうのは柔軟じゃなく薄弱と言うんだ
0603nobodyさん03/06/22 14:27ID:???
//
/* */
からなるコメント文を消すには、どう書けばいいんですか?
060459703/06/22 16:22ID:???
この道場冷たいなあw
ちょっとくらい稽古つけてくださいよ
こんな感じで頑張ってはいるんですよ

preg_match_all ("/<\s*a\s[^>]*?href\s*=\s*(?:\"|\'|)([-!\#\$%&()*+,.\/:;=?\@~\w]+)(?:\"|\'|)[^>]*?>([\s\S]+?)<\/a>/i",
$contents, $out, PREG_SET_ORDER);
0605nobodyさん03/06/22 18:20ID:???
>>604
「aをスペースで囲む」ってのに対応するのはナンセンスな気がするな。

つーか、正規表現一つで処理せなあかんの?

"#<a[^>]*\shref\s*=\s*(?:\"([^\"]+)\"|'([^']+)'|(\S+))[^>]*>(.+?)</a>#i"
0606nobodyさん03/06/22 18:22ID:???
>>604
お前は相手にされない
060760303/06/22 18:24ID:???
<a href=""> と決め打ちするのはどうして?

<a alt="" href=""> はありえないことが確定してるの?
0608nobodyさん03/06/22 18:29ID:???
<a>にaltはないが、titleとかclassなんかはありえるな。
0609nobodyさん03/06/22 20:57ID:???
[<\s]+a [^>]*href[\s=]+(?:"([^"]+)"|'([^']+)'|([^\s>]+))[^>]*>(.+?)</a>
0610nobodyさん03/06/22 23:44ID:???
<A
    name    =    "    anchor_id    "
    HREF    =    https://www.hogehoge.com/
    target    =    '    _blank    '
>
            ほ    <b>    げ    </b>    ほ    <i>    げ    </i>
</a

>
0611nobodyさん03/06/23 00:44ID:???
以後、この手は放置で。
0612nobodyさん03/06/23 00:48ID:???
駄目だこりゃぁ…

ここは別に最初から最後まで手取り足取り教える為のスレッドじゃないんだよ
>>598 で充分過ぎるほどヒント出てるんだから、自分で「正規表現」を
習得しつつコードを書こうという気は起きないのかい?
061359703/06/23 02:57ID:???
どうせ正規表現をつかって作るのなら柔軟なものを、と思っています。
今まで見てきたHTMLで「文法はおかしいけれどありそうなもの」
「このくらいならありえるかな」ってのを>>599にいくつかピックアップしてみました
ちょっとありえないものもあるかもしれません

万能(に近い)リンク抽出正規表現ってのをつくってみませんか?
>>599のリストに、他にもありえそうなものを追加して……
0614nobodyさん03/06/23 03:03ID:???
出来たら教えてくれ。
とりあえずそろそろウザイ。
061559703/06/23 03:11ID:???
>>614
スマソ

とりあえず>>599から>>605にあるように「aをスペースで囲む」を無くして
>>610にも対応したもの

#<a[^>]*\shref\s*=\s*(?:\"([^\"\s]+)\"|'([^'\s]+)'|([^>\s]+))[^>]*>(.+?)</a>#i
0616nobodyさん03/06/23 03:23ID:???
なんで今さらリンクの正規表現なんか作らにゃならんのだ・・・
0617nobodyさん03/06/23 03:51ID:???
>>615
</a>で閉じられてない奴とか<,>の前後の空白とか
"(ダブルクォート)じゃなくて'(シングルクォート)だったり
061860503/06/23 05:02ID:???
>>615
センスねぇな・・・
0619nobodyさん03/06/23 05:27ID:???
>>615
・hrefの前に>があったら失敗するな(ex. title="<1>")
・行に2つ以上anchorがあったら1つめのマッチングで
 最後の</a>までマッチしそうだ
まあがんがれ
0620nobodyさん03/06/23 05:31ID:???
>>619
ああ、.+?って最小マッチってやつっすか。。。スマソ
0621nobodyさん03/06/23 14:28ID:???
>>615
>・・・(.+?)</a>#
(.+?)の部分に<!-- </a> -->が入ってたら?
0622nobodyさん03/06/23 18:33ID:???
正規表現だけで完璧なものを作ろうと思ってもむるなんじゃない?
0623nobodyさん03/06/23 18:50ID:???
おれもむるだと思う。
0624nobodyさん03/06/23 18:56ID:???
小魚が取れればいい網をクジラやプランクトンまで対応しようと無駄なコストを
062559703/06/23 18:57ID:???
>>617
</a>で閉じられてないってのはどういうことっすか?
「< /a >」だとか「</a <!-- /ここまで -->>」とかですか?

リンクを正規表現で抽出する前に、コメントを取り除いたほうがいいですよね
それとも男なら一度にやるべきでしょうか……

PHPなら「アンカータグ以外を取り除く」なんて簡単に出来ちゃいますし
062659703/06/23 19:29ID:???
< /a>と title="<aaa>" はブラウザがうまく表示できないみたいなんで(IE6のみ確認)
対応しなくてもいいかな、と思いつつ一応やってみたら

<a title="<aaa>" href="http://www.aaa.aaa">他要素の中に<>がある</a>
<a href="http://www.aaa.aaa"><!-- リンク </a> -->文字列にコメントがある</a>

のようなものも上の正規表現で問題なく抽出できました、なんでだろう?w
062759703/06/23 19:32ID:???
上は「< /a>」ではなく「< /a >」の誤りですスマソ
「< /a>」はIE6で正常にリンクされてます。

仕様よりもIEを基準にするな!って怒らないでくださいね
0628nobodyさん03/06/23 19:43ID:???
世の中のふつーのブラウザは、
<a> が明らかに閉じてるべきとこまではリンクと見做してくれてるんでしょ。
アフォな HTML 作成者を救うために。

ところで、パレートの法則って知ってる?
つーか、アンカータグの抽出なんてこのスレでも思いっきり概出やろ。
0629nobodyさん03/06/23 20:43ID:???
たのむからHTMLを真剣に勉強してくれ。
IE?いつまでバカブラウザをマンセーしているつもりだよ(つД`)
<a>はインライン要素。
http://www.asahi-net.or.jp/%7Esd5a-ucd/rec-html401j/struct/links.html#edef-A
0630nobodyさん03/06/23 22:32ID:???
>>628
>アンカータグの抽出なんてこのスレでも思いっきり概出やろ。
だけどこの質問者は「万能な」ものを求めてる。
HTMLがいくら間違ってても抽出したいと思ってるわけだ。
#その時点でオ�hルんだがな。
0631nobodyさん03/06/23 23:57ID:???
おぃおぃ、もう夏厨の季節か?(藁
0632nobodyさん03/06/24 00:17ID:VrEbx1+X

正規表現を使って、あるテキストの先頭から10行目を取得する書き方が、
解りません…どたか教えて下さい。どうか、お願いします。
JDK1.4.1の正規表現クラスを使ってます。
0633nobodyさん03/06/24 00:20ID:VrEbx1+X
↑補足です。すいません、Jakarta-OROでもいいっす(Perl5ね)
0634nobodyさん03/06/24 00:58ID:???
またくれくれか。もううんざり。
0635nobodyさん03/06/24 01:39ID:???
splitで取得してやったぜ!

$line10 = (split(/\n/, $text))[9];
0636nobodyさん03/06/24 01:54ID:???
>>632




それのどこが「正規表現」なのかと(ry





0637nobodyさん03/06/24 02:08ID:???
>>636




それのどこが「>>632宛」なのかと(ry





0638nobodyさん03/06/24 03:09ID:???
なんでもかんでも正規表現使えばいいと思ったら大間違いなわけだが。

/\A((?:.*\n){0,10})/m
0639名無しさん@Meadow03/06/24 07:35ID:???
>>638
\Aて何?Perlじゃないでそ。

0640nobodyさん 03/06/24 09:10ID:???
>>639
文字の最初だよ・・・

ttp://www.kt.rim.or.jp/~kbk/regex/regex.html

見て勉強しなおしなされ
0641名無しさん@Meadow03/06/24 10:27ID:???
>>640
べんきょ足りんですた。逝って来マウス。
0642nobodyさん03/06/24 13:05ID:???
>>626
title="<aaa>"は正当だよ。
title="&lt;aaa&gt;"と書かれていたときはtitle="<aaa>"と
解釈しなくてはならないが、title="<aaa>"と書いてはいけないという
意味ではない。&を&amp;と書かないと誤解釈する可能性が
あるという問題とごっちゃにされてるんだろうな。
0643nobodyさん03/06/24 13:10ID:???
謎HTMLでも抽出したいと思うのは勝手だが
それならせめてどういう謎HTMLも許容したいのか
仕様を明確にしてくれないと作りようがない。
0644nobodyさん03/06/24 14:07ID:???
つまりHTMLの仕様を無視した偽HTMLの仕様を書け、ということですな。
0645nobodyさん03/06/24 14:07ID:???
今、>>643 が良いこと言った。
というわけで、以後、要求仕様を明確にしてないお題は放置で。
0646nobodyさん03/06/24 14:14ID:???
>>645
勝手に仕切んなよ。ヴォケが。
0647nobodyさん03/06/24 14:18ID:???
>>646
名前が597じゃなくnobodyさんになってるぞ?
0648nobodyさん03/06/24 16:44ID:???
>>646 = >>597
0649nobodyさん03/06/24 18:14ID:???
>642
(゚Д゚≡゚Д゚)エッナニナニ?本当か?
0650nobodyさん03/06/24 18:25ID:???
>できれば下のに対応できるくらい柔軟なものってできませんか?
とか
>万能(に近い)リンク抽出正規表現ってのをつくってみませんか?
みたいな他力本願なレスは激しく萎える事に>>597は気づいているのかなー?
065159703/06/24 18:45ID:???
>>650
「今更リンクの抽出かよ……」なんて萎える人もいるでしょうが
まあ暇だし付き合ってやるか、という人もいるかなと思ってはじめました
他力本願ですが、道場ということで甘えてみましたw

>>643-645
仕様といっても難しいので、ありえそうなものを考えると
>>599>>610>>626あたりになるのかなって感じです
今出てるものでは>>615ですべて対応できてるはずです

つーか実際に間違ってるHTMLって多いですよね
リンクを抽出することを考えたときに
HTML書いた人に直すようにメールするか
対応した正規表現にするかどっちが早いかって話です
0652nobodyさん03/06/24 18:51ID:???
死ね。ヴォケ
0653nobodyさん03/06/24 18:57ID:???
>>651
これ以上は別スレ立ててやってくれ。
HTML lintのページは参考にならんか?
0654nobodyさん03/06/24 20:56ID:???
>>651
道場で鍛えるのは自分自身だよ。
鍛えている人を眺めているだけでは上達しない。
とりあえず邪魔。
0655nobodyさん03/06/27 13:05ID:???
すみません、ちょっと教えて頂きたいんですけど、
$_ = "w439soz980i505";
@a = /^(?:(\w)(\d{3}|[ao]))+$/;

上のような正規表現で、括弧に入った文字列を全て@aに入れたいんですが、
実際にはループの最後の"i"と"505"だけしか入りません。
全てを@aに入れる方法はあるんでしょうか?
0656nobodyさん03/06/27 14:07ID:???
>>655
@a = /((\w)(\d{3}|[ao]))+?/g;

@aの中身 w439 w 439 so s o z980 z 980 i505 i 505
0657nobodyさん03/06/27 23:00ID:???
Perl5の正規表現で
$fn =~ s/\W/\0/g;
$fn =~ s/\0/\|/g;
は、一体どういう処理をしているのか判る方いませんでしょうか
0658nobodyさん03/06/27 23:17ID:???
>>657
単語構成文字(_a-zA-Z0-9)以外の文字が | に置き換わる。
065965503/06/28 00:06ID:???
>>656
レスが遅れてすみません。
どうもありがとうございました。参考になりました。
0660nobodyさん03/06/28 04:40ID:???
なんで
$fn =~ s/\W/\|/g;
じゃないんだろう
0661nobodyさん03/06/28 04:59ID:???
\Wがなくて\0だけあったときでも置き換えられるように
0662nobodyさん03/06/28 05:20ID:???
>>658
うーんなるほど。\|を変に難しく考えてました。
回答ありがとうございます。
0663nobodyさん03/06/28 08:45ID:???
>>657
あ、ごめん。\0 って null 文字の事?
0664nobodyさん03/06/28 19:23ID:???
\0=\000
0665nobodyさん03/06/29 09:15ID:???
\0=\000=\x00
0666nobodyさん03/06/30 16:02ID:???
>>661
\0って\Wに含まれないの?
0667nobodyさん03/06/30 16:44ID:???
含まれないだろ。多分…
0668nobodyさん03/06/30 17:10ID:???
>>667
多分じゃねーよ。ちゃんと調べろよ。

print "MATCHED\n" if ("[\0]" =~ /^\W+$/);
0669nobodyさん03/06/30 17:12ID:???
めんどくせ ヽ(´Д`;)ノ
0670nobodyさん03/07/03 21:15ID:???
保守
0671nobodyさん03/07/08 23:40ID:???
>>662
Perlの場合記号に\付けてもメタ文字にならない
このスレはPerlとは限らんが
0672nobodyさん03/07/10 13:41ID:???
2143184 といった数字の羅列を
2,143,184という風に3桁ごとにカンマを入れるにはどうしたらいいですか?
おしりからマッチさせることができれば簡単なんですが。

この桁数だと,

/^([0-9]{,2})([0-9]{3})([0-9]{3})$/
を
\\1\,\\2\\3

としたらできるんですが,もっときれいにできる方法を教えてください
067367203/07/10 13:50ID:qpJaCER1
× \\1\,\\2\\3
○ \\1\,\\2,\\3
0674nobodyさん03/07/10 14:00ID:???
>>672
ttp://www.din.or.jp/~ohzaki/perl.htm#NumberWithComma
0675nobodyさん03/07/10 14:23ID:???
>>674
Thx
つまり回すと言うことですね
0676あぼーんNGNG
あぼーん
0677山崎 渉03/07/15 11:08ID:???

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
0678nobodyさん03/07/15 22:27ID:bkNlTgQn
Perlの掲示板の書き込みで、>が先頭に来た書き込みを<blockquote>で囲むため、
$str =~ s/(^|<br>)>.*?(?=<br>|$)/<blockquote>$&<\/blockquote>/g;
$srt =~ s/<\/blockquote><blockquote>//g;
このような正規表現を書きました。
でもなんかスマートではないので、
上記二つのをまとめて表すにはどうすればいいのでしょうか?
0679nobodyさん03/07/16 00:28ID:???
$line =~ s/^(..)(...)//;
正規表現してください,お願いします。
0680nobodyさん03/07/16 00:42ID:???
先頭って何だ?

つか何でblockquote?
0681nobodyさん03/07/16 01:55ID:???
>>680
「引用」だから。
0682nobodyさん03/07/16 01:58ID:???
>>681
中途送信鬱。

>>678
行頭の「>」で加工したいのなら、一旦行ごとに配列にいれてから加工してみてはどうぢゃろ?
0683nobodyさん03/07/16 02:15ID:???
$str =~ s/(^|<br>)((?:&gt;.*?(?:<br>|$))+)/$1<blockquote>$2<\/blockquote>/g;
068467803/07/16 17:05ID:???
>>683
ありがとうございます。完全に出来ました。
それに、マッチ変数も使っていないので一挙両得です。
本当にありがとうございます。
0685nobodyさん03/07/16 22:57ID:???
perl質問箱で質問したらココに行って来いって言われたので来ました

掲示板なんかで、引用符「>」「>」から先の文字の色を変えるにはどうしたらいいですか?
0686nobodyさん03/07/16 22:59ID:???
>>685
ちょっと前のレスをみりゃぁ分かる。

色程度ならCSSをつかえばいいしな
068767903/07/17 00:29ID:???
教えてもらえないでしょうか?
0688nobodyさん03/07/17 00:33ID:???
>>679,687

何がしたいのか意味不明。
068967903/07/17 01:28ID:???
すみません・・・CGIの抜き出しなんですけど、
$line =~ s/^(..)(...)//;を、PHPで使いたいんでどのように正規表現したら、
いいでしょうかということで・・・



0690nobodyさん03/07/17 02:06ID:???
>>689
CGI とか正規表現よりも、日本語の勉強したほうがいいぞ。
0691nobodyさん03/07/17 02:26ID:???
>>689
そのperlの文が何をしてるか分かってる?
perl互換の正規表現は preg_* で使えるから、PHPのマニュアルをよく読んでごらん。
0692nobodyさん03/07/17 09:54ID:???
夏厨&PHP厨らしい質問方法だな。質問内容も意味不明だがな(うひょげら
0693nobodyさん03/07/17 17:00ID:???
>>692
裳前の方が房っぽいがな
069467903/07/17 17:32ID:???
解決しました。^の意味解かってませんでした・・・
0695nobodyさん03/07/17 18:06ID:???
>>679を見て誰が何を答えることができるのだろう。本気で教えてもらおうとしてたんだろうか。
0696nobodyさん03/07/18 01:30ID:???
>>695
釣りでしょ。釣果は芳しくなかったようだが。
0697nobodyさん03/07/18 10:04ID:qmPObEGp
やりたいこと
 PHP4.2.3-9でタグの外側の文字のみ置換したい

<?
$word = "<a href=\"http://hoge.hoge/bb/\">link Bb</a>";
echo "これを$word<br>\n";

$word2 = "<a href=\"http://hoge.hoge/bb/\">link <b>B</b><b>b</b></a>";
echo "こうしたい$word2<br>\n";

$word = preg_replace("/((?:\G|>)[^<]*?)(b)/i","\\1<b>\\2</b>",$word,-1);
echo $word;
?>

実行結果は
<a href="http://hoge.hoge/<;b>b</b>b/">link <b>B</b>b</a>
になりました。
■ このスレッドは過去ログ倉庫に格納されています