- 1 名前:nobodyさん [2007/01/11(木) 02:40:43 ID:uW7xEbZY]
- 【正規表現道場の掟】
・言語不問 ・質問も大歓迎。使用言語を書くのを忘れずに。 正規表現と関係ない話・質問は他スレへどうぞ。
- 598 名前:nobodyさん [2009/12/23(水) 22:25:52 ID:Hajqsr0G]
- HTMLタグの <ul> <li> について、入れ子構造になっていた場合も考慮しつつ Pukiwiki等の記法に変換しようと考えています
<ul> <li>1行目@1段目 <li>2行目@1段目 <ul> <li>3行目@2段目 <li>4行目@2段目 </ul> <li>5行目@1段目 </ul> これを - 1行目@1段目 - 2行目@1段目 -- 3行目@2段目 -- 4行目@2段目 - 5行目@1段目 こんな感じにしようと四苦八苦しているのですがどうにも難しく… ヒントだけでも良いのでアドバイスをお願いします。 今は、<ul>が存在する限り <ul>( <ul>以外 )<\/ul> を抜き出して その中を /<li>(.*?)<\/li>/s で置き換えて、抜き出し元と差し替えて 最初に見つかった<ul>(.*?)<\/ul>について <ul> と </ul>を削除、と考えていますが 最初の <ul>以外 の時点で既につまづいている始末です。
- 599 名前:nobodyさん mailto:sage [2009/12/23(水) 23:13:19 ID:???]
- $head= '';
$s=~ s/(<ul>)\s*|(<\/ul>)\s*|<li>(.*)(?:<\/li>)?\s*/$1?scalar($head.='-',''):$2?scalar(($head=substr($head,1)),''):"$head $3\n"/gei; print $s;
- 600 名前:nobodyさん [2009/12/29(火) 00:08:08 ID:F3P1tBWB]
- 文字列の中にある¥を除去したかったのですが、preg_replace('/¥/')や
preg_replace('/¥¥/')では削除できなかったのですが、preg_replace('/¥¥¥/')だと削除できました・・・ これはなぜでしょうか。 ¥は次に有る文字をエスケープするわけですから、preg_replace('/¥¥/')でいけそうな気がするのですが。。。 正規表現初心者につき、低レベルですがご教授よろしくお願いいたします。 (上記は、あえて半角ではなく、全角の¥で説明しています。)
- 601 名前:nobodyさん mailto:sage [2009/12/29(火) 12:06:00 ID:???]
- やりたいこと自体はstr_replaceでできるだろうけどphpの正規表現がなんかおかしいな。
perlならそれで通るはずだけど。
- 602 名前:nobodyさん mailto:sage [2009/12/29(火) 12:38:00 ID:???]
- 文字列としてのエスケープと正規表現としてのエスケープは別。
'/\\/' は /\/ '/\\\/' は /\\/ '/\\\\/' も /\\/
- 603 名前:600 [2009/12/29(火) 22:52:30 ID:F3P1tBWB]
- >>601-602
なるほど!! そういうことでしたか。 ありがとうございます!
- 604 名前:nobodyさん mailto:sage [2009/12/30(水) 09:01:55 ID:???]
- ああそうか、phpだとシングルクオートで囲んでも\はエスケープに解釈されるのか。
- 605 名前:nobodyさん mailto:sage [2010/01/24(日) 19:36:14 ID:???]
- <a href="test.php?id=0001">あいうえお</a>
<div class="id">0001</div> <div class="time">20100101010101</div> <div class="name">なまえ</div> <div class="body">コメント</div> 上記のタグがあったとして、 preg_match_all("/<a href=\"test.php\?id=0001\">(.*)/<\/div>\" style=\"display: none;\">/", $hoge, $data); のように書くと、指定したIDのaタグ内の文字がとれるのですが、その下の<div class="id">から<div class="body">の後の</div>までのタグ、 もしくはそのタグ内の文字列を抽出したいのですがうまくいきません。 それぞれのタグは1行でつながってるものとして、複数タグの範囲内を取るのは可能なのでしょうか?
- 606 名前:nobodyさん mailto:sage [2010/01/24(日) 20:12:18 ID:???]
- 複数ならpreg_match_all()使うけど一つならpreg_match()で以下のように
preg_match('/\bid=(\d+)[^>]+>([^<]*)<\/a>.*?"id">\1<.*?"time">(\d+)<.*?"name">([^<]*)<.*?"body">([^<]*)</is', $s, $match);
- 607 名前:nobodyさん mailto:sage [2010/01/24(日) 21:01:02 ID:???]
- 有難うございます。
IDが0001以外のコメントもひろっちゃっていますが、かなり希望するのに近づいてきました。 もう少し細かく書くべきでしたが、複数のIDがあり、同じIDでのコメントも複数あった場合です。 上記のタグが一つのセットとして、いくつかある中の <a href="test.php?id=0001">あいうえお</a>のタグとコメント部分をまとめて表示させたいと思っています。 id=の部分を改変して直接0001を指定したらだめだった・・・
- 608 名前:nobodyさん mailto:sage [2010/01/25(月) 01:28:52 ID:???]
- 試行錯誤したらなんとか希望通りのものができました。
正規表現だけに囚われててプログラムがよろしくなかった…
- 609 名前:nobodyさん mailto:sage [2010/02/03(水) 12:34:08 ID:???]
- 先生質問です
Rewriteで動的URLを静的URLにしたいのです やりたいことは6つのクエリを書き換えたいのですが 6つのうち1つのとき、2つのとき、・・・6つのときというように組み合わせがかなりの数になってしまうと思うのですが 順列で 6P1 + 6P2 + 6P3 + 6P4 + 6P5 + 6P6 と考えてよいのでしょうか? 6つも書き換えなんてやっぱ無理でしょうか?
- 610 名前:nobodyさん mailto:sage [2010/02/03(水) 13:22:42 ID:???]
- ちょw
- 611 名前:nobodyさん mailto:sage [2010/03/02(火) 21:59:18 ID:???]
-
- 612 名前:nobodyさん mailto:sage [2010/03/02(火) 22:11:34 ID:???]
- test
- 613 名前:nobodyさん mailto:sage [2010/03/08(月) 15:33:08 ID:???]
- MySQLダンプ内の
/*------------------ここから--------------------*/ DROP TABLE IF EXISTS `table100`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `table100` ( `code1` varchar(5) default NULL, `zip1` varchar(7) default NULL, `address1` varchar(250) default NULL, `address2` varchar(250) default NULL, `div_1` varchar(1) default NULL, `div_2` varchar(1) default NULL, `import_date` timestamp NULL default NULL, `rec_key1` int(10) unsigned NOT NULL auto_increment, PRIMARY KEY (`rec_key1`) ) ENGINE=InnoDB AUTO_INCREMENT=121471 DEFAULT CHARSET=eucjpms; /*!40101 SET character_set_client = @saved_cs_client */; /*------------------ここまで--------------------*/ `table100` → `TABLE100` `code1` → `CODE1` など逆クォートで囲まれた小文字→大文字変換を一括で行いたいです。。 できればlinux コマンドライン、perl などでお願いします。。
- 614 名前:nobodyさん mailto:sage [2010/03/08(月) 18:01:54 ID:???]
- たぶんs/`(\w+)`/`\U$1`/g
- 615 名前:nobodyさん mailto:sage [2010/04/11(日) 00:10:39 ID:???]
- eregで半角記号のみをマッチさせてfalseを返す処理を組んでいるのですが、
何故か一部の漢字が引っ掛かってしまいます…確認した所では夕焼けの「夕」の 文字などです。 if(ereg ("[[:punct:]]",$_POST['名前'])) こんな感じです。今までは普通に機能していたんですが… どなたかアドバイス頂けないでしょうか?
- 616 名前:nobodyさん mailto:sage [2010/04/11(日) 02:49:42 ID:???]
- >>615
ereg って多バイト文字に対応してないんじゃないか?
- 617 名前:nobodyさん mailto:sage [2010/04/12(月) 09:23:26 ID:???]
- eregはPHP5.3.0から非推奨になってるので新しく書くプログラムでは
使わないほうがいいよ。perl互換正規表現(PCRE)をお使いください。
- 618 名前:nobodyさん mailto:sage [2010/05/02(日) 00:32:33 ID:???]
- :wink:, :lol:, :cry:, :evil:, :twisted:, :roll:, :idea:, :arrow:, :mrgreen:, :),
:-(, :!:, :?:, :oops:, :-o,:-D,8-|,8-), :??, :x:, :-P, :ase:, =:[, :ahhh:, :star0.0:, :star0.0:, :star0.5:, :star1.0:, :!!!:, :**:, :heart:, :!!:, :hahaha:, :chin:, :[], :| こんな感じのスマイリーコードをマッチさせるのに、 $string = '{[:\*8=][(^:|*|a-zA-Z\-!?_\.\d\[)]*[(.*:)(.*\*)(.?)(:*[)(\])PoD\|]}; こんな感じのコードにしてみたけど、もっとスマートに出来ますか? しかし、正規表現はパズルみたいで面白いね。
- 619 名前:nobodyさん mailto:sage [2010/05/02(日) 04:08:13 ID:???]
- >>618
スマートさではこっちのが上だね :P (:(wink|lol|cry|evil|twisted|roll|idea|arrow|mrgreen|\!|\?|oops|x|ase|ahhh|star0.0|star0.5|star1.0|\!\!\!|\*\*|heart|\!\!|hahaha|chin):) |(:)|:-(|:-o|:-D|8-\||8-)|:??|:-P|=:[|:[]|:\|)
- 620 名前:nobodyさん mailto:sage [2010/05/02(日) 04:53:21 ID:???]
- >>619
色々バグってた my @g = $str =~ /( (?: \: (?: ahhh | arrow | ase | chin | cry | evil | hahaha | heart | idea | lol | mrgreen | oops | roll | star0\.0 | star0\.0 | star0\.5 | star1\.0 | twisted | wink | x | \!\!\! | \!\! | \! | \*\* | \? ) \:) | (?: \:-\) | \:\-\( | \:\-D | \:\-P | \:\-o | \:\?\? | \:\[\] | 8\-\| | 8\-\) | \=\:\[ ) )/gx;
- 621 名前:nobodyさん mailto:sage [2010/05/02(日) 10:16:16 ID:???]
- >>618のだと:aaaaa:とか存在しないものまでマッチしちゃうよ?
((?:\:(?:(?:ahhh|arrow|ase|chin|cry|evil|hahaha|heart|idea|lol|mrgreen|oops|roll|star(?:0\.[05]|1\.0)|twisted|wink|x|\!{1,3}|\*{2})\:|\?[:?]|(?:\)|\[\]|\||\-[(oDP])))|(?:8\-[|)])|=\:\[)
- 622 名前:nobodyさん mailto:sage [2010/05/02(日) 11:44:31 ID:???]
- >>619-621
そうか、未来の拡張を考えて緩くしたけど、 2バイト文字以外のブログじゃ広くマッチしすぎるって事か。。。 それじゃスマイリーコードの方に厳格なルールを... なんって考えるのもユーザーに優しくないし。 折り合いつけるの難しいね :|
- 623 名前:nobodyさん mailto:sage [2010/05/02(日) 19:52:37 ID:???]
- >>622
厳格さが必要でない処理が行われるというのがイメージできんのだけど、 マッチさせてどうしたいんだ?
- 624 名前:nobodyさん mailto:sage [2010/05/02(日) 20:21:19 ID:???]
- >>623
とあるCMSで、 引用表示の時は、リンクとか画像とか取っ払う追加プログラム書いてるから。
- 625 名前:nobodyさん mailto:sage [2010/05/02(日) 22:35:26 ID:???]
- >>624
文から推測すると、前提として普通の記事の場合はスマイリーコードとやらが画像に変換されるということがあって、 その記事が引用されてる場合はそれらを除去したいということか? 前提が正しいならスマイリーコードを画像に変換する時に使ってるルールを厳格に使うべきだし、 正しくないならリンクでも画像でもないスマイリーコードを除去する必要がないと思うんだが
- 626 名前:nobodyさん mailto:sage [2010/05/02(日) 23:09:45 ID:???]
- >>625
正解です。 通常記事ではスマイリーコードが画像に変換されます。 で、引用時には、それら(改行,スペース,タブ,画像,リンク等)を除去して コンパクトにしたいのです。 引用文にスマイリーが入ってもいいんですが、 記事を丸める過程で<img>タグが邪魔したので、除去するを仕様としました。
- 627 名前:nobodyさん mailto:sage [2010/05/03(月) 00:05:08 ID:???]
- >>626
一度img要素に置換したものをベースにするというのがそもそもおかしいのでは? もしかして表示する直前に置換してるんじゃなくて、DBに突っ込む段階で置換しちゃってるとか? それだったら設計を見直したほうがいいと思うんだけど
- 628 名前:nobodyさん mailto:sage [2010/05/03(月) 00:07:04 ID:???]
- >>626
じゃあやっぱり >スマイリーコードを画像に変換する時に使ってるルールを厳格に使う が一番スマートなんじゃないか それができないなら一旦引用されていない記事として処理して、そこからimgタグを除去するとか 正規表現の話からはだいぶそれたので俺はこれ以上何も言わないことにするよ :P
- 629 名前:nobodyさん mailto:sage [2010/05/03(月) 00:36:11 ID:???]
- >>627-628
スマイリーコードが置換されるのはDBから引っ張ってからですが、 追加プログラムの導入IDによって優先順位があるので単純ではないんです。。。 で、私も正規表現から脱線しすぎなのでこれが最後。 脱線ついでに、タイムズスクウェアで爆発物を積んでた車って。。。 家の車も正規表現でマッチしちゃうwww
- 630 名前:nobodyさん [2010/05/19(水) 16:47:15 ID:t/z/xcK5]
- 質問させてください!
ああああああ @ ABCD @ abcd という文字を <b>ああああああ</b> @ ABCD @ <em>abcd</em> のように置換したい時はどういう正規表現を使えばいいのでしょうか? よろしくお願いいたします
- 631 名前:nobodyさん mailto:sage [2010/05/19(水) 17:44:20 ID:???]
- その例にするための条件って何?
スペース @ スペース が区切りとか?
- 632 名前:nobodyさん [2010/05/20(木) 19:43:15 ID:avs5qFDL]
- 質問させてください。
<table> <tr> <th>名称1</th> <td> 値1 </td> </tr> <tr> <th>名称2</th> <td> 値2 </td> </tr> </table> のようなHTMLがあります。 実際には全ての改行とインデントはトリムされてます。 この値1の部分をとるにはどのような正規表現を使えば良いでしょうか? <th>名称1</th><td>([^<]*)</td> のように考えてましたが値1には<img>タグが入る場合があります。 <table>や<td>が入ることはありません。
- 633 名前:632 mailto:sage [2010/05/20(木) 19:44:24 ID:???]
- 途中で投稿してしまいました。
お手数ですがご教授よろしくお願いします。 なお、当方18歳女子になります。
- 634 名前:nobodyさん mailto:sage [2010/05/20(木) 19:54:06 ID:???]
- <th>名称1</th><td>(.*?)</td>
- 635 名前:nobodyさん [2010/05/20(木) 20:40:36 ID:a5arSWsA]
- www19.atpages.jp/imagelinkget/get.php?t=v&u=www.phpbook.jp/regexp/ini/img/p1-1.png
ukiya.sakura.ne.jp/index.php?plugin=ref&page=%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E8%AC%9B%E5%BA%A7%2F1&src=regex1.png ukiya.sakura.ne.jp/index.php?plugin=ref&page=%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E8%AC%9B%E5%BA%A7%2F8&src=regex8.png
- 636 名前:nobodyさん mailto:sage [2010/05/20(木) 21:13:11 ID:???]
- <th>名称1</th><td>(値1|<img>)</td>
- 637 名前:632 [2010/05/21(金) 22:05:20 ID:E8tDrX2s]
- ありがとうございました。
無事に解決できました。 これより踊りに行くのでこれにて失礼致します。
- 638 名前:nobodyさん mailto:sage [2010/05/24(月) 12:25:48 ID:???]
- 便乗だけど
<table> <tr> <th>名称1</th> <td class="abc"> 値1 </td> </tr> <tr> <th>名称2</th> <td class="def"> 値2 </td> </tr> ...あと何個か続く この場合 <th>名称1</th><td .*>(.*?)</td> にしたのですが 何故かうまく 値1 だけ取得できません どうも .*で余計なものも取得しているようです どう書けばいいでしょうか 当方JKです。
- 639 名前:nobodyさん mailto:sage [2010/05/24(月) 14:40:31 ID:???]
- <th>名称1</th><td .*?>(.*?)</td>
|

|