- 1 名前:nobodyさん [2007/01/11(木) 02:40:43 ID:uW7xEbZY]
- 【正規表現道場の掟】
・言語不問 ・質問も大歓迎。使用言語を書くのを忘れずに。 正規表現と関係ない話・質問は他スレへどうぞ。
- 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>
- 640 名前:nobodyさん mailto:sage [2010/06/10(木) 09:40:35 ID:???]
- 現在、HTMLのimgタグを使って「/img/jpg/」ディレクトリにある画像ファイルを複数表示しています。
例) <img src="/img/jpg/1111.jpg" > <img src="/img/jpg/mm2222.jpg" > <img src="/img/jpg/kkkkk3333.jpg" > これをそれぞれ、以下のように置換したいと考えています。 例) <a href="www.xxxxx.jp/1111.jpg"><img src="/img/jpg/1111.jpg" width="240px"></a> <a href="www.xxxxx.jp/mm2222.jpg"><img src="/img/jpg/mm2222.jpg" width="240px"></a> <a href="www.xxxxx.jp/kkkkk3333.jpg"><img src="/img/jpg/kkkkk3333.jpg" width="240px"></a> imgタグをリンクタグで囲むのですが、リンク先URLには元々の画像ファイル名が使われています。また、imgタグには「width="240px"」が付加されています。 このような置換をPHP5で行うには、どのような正規表現を使用したらよろしいでしょうか。 宜しくお願い致します。
- 641 名前:nobodyさん mailto:sage [2010/06/10(木) 16:43:49 ID:???]
- 素人です。
s/<img src="\/img\/jpg\/(.+)\.jpg" >/<a href="http:\/\/www\.xxxxx\.jp\/\1\.jpg"><img src="\/img\/jpg\/\1\.jpg" width="240px"><\/a>/; こんな感じになるのかと思いますがどうでしょうか?
- 642 名前:nobodyさん [2010/07/01(木) 16:19:28 ID:qVVuQ4W9]
- Perl 5.8 /5.10で使用します。
HTMLソースの中のimgタグのファイル名を正規表現などで一括で変えたいです。 <img src="www.hoge.com/aaa/bb/ccc/ddd.jpg" alt="sss"> <img src="/xxx/yyy.png"> <img src="../aaa/fff/xxx/ccc.gif" width="32" height="16"> ↓ <img src="/images/ddd.jpg" alt="sss"> <img src="/images/yyy.png"> <img src="/images/ccc.gif" width="32" height="16"> こんな感じです。どの様にしたらよいでしょうか。
- 643 名前:nobodyさん mailto:sage [2010/07/01(木) 17:11:08 ID:???]
- >>642
s|(<img[^>]* src=")[^"]*/([^/"]+"[^>]*>)|$1/images/$2|ig
- 644 名前:nobodyさん [2010/09/13(月) 00:25:36 ID:BUnMGSIw]
- php5.3です。
%でかこまれた(%test%)文字をpreg_matchでヒットさせたいんですが、どういう文字列にすればいいんでしょうか? ちなみに、'/%%([^%])%%/'ではだめでした。
- 645 名前:nobodyさん mailto:sage [2010/09/13(月) 00:27:10 ID:???]
- 間違えた。
'/%%([^%]*)%%/'です。
- 646 名前:nobodyさん mailto:sage [2010/09/13(月) 00:33:05 ID:???]
- %%test%% と書かれてたら %test% がキャプチャするようにしたいのか
%test% と書かれてたら test をキャプチャするのかどっち? 後者だと勝手に決め付ける。'/%([^%]+)%/'
- 647 名前:nobodyさん mailto:sage [2010/09/23(木) 15:56:42 ID:???]
- find . -type f -iregex ".*[^html|htm|gif|jpg|jpeg|png|css|js|swf|xml]" -print
でウェブ関連以外のファイルを抜き出しいのだけれど、 なぜか在るはずの【*.pdf】が出てきません・・・。 書き方が不味いのでしょうか。
- 648 名前:nobodyさん mailto:sage [2010/09/24(金) 17:04:12 ID:???]
- [^html|htm|gif|jpg|jpeg|png|css|js|swf|xml] = [^cefghijlmnpstwx|]
- 649 名前:647 mailto:sage [2010/09/24(金) 20:33:46 ID:???]
- >648
find . -type f ! \( -name \*.html -o -name \*.htm -o -name \*.css -o -name \*.js -o -name \*.gif -o -name \*.jpg -o -name \*.png -o -name \*.swf -o -name \*.xml -o -name \*.pdf \) -print を、-iregex使って短くするにはどう書けばいいんのでしょうか。
- 650 名前:nobodyさん [2010/09/26(日) 06:42:01 ID:JLVe9rj0]
- Firebugで"aaaaaaaaaaaaaaaaaaaa".match(/(a)/)とすると2つしかヒットしないんですが、
全部のaをヒットさせるにはどうしたらいいんでしょうか?
- 651 名前:nobodyさん mailto:sage [2010/09/26(日) 22:12:08 ID:???]
- >>650
コールバック使うときは1つめの引数は全体だよ "aaaaaaaaaaaaaa".match(/(a)/g); これでいいと思う
- 652 名前:nobodyさん mailto:sage [2010/10/03(日) 17:27:45 ID:???]
- 『a*a/a/*/a*a/a/*/a*a/a*a/a/*/a*a/a/*/a*a/a*a/a/*/a*a/a/*/a*a/a*a/a/*/a*a/a/*/a*a/a』
この文字列の /* ~~~ */ で囲まれた部分それぞれを全て正規表現で抜き出せるのですか?
- 653 名前:652 mailto:sage [2010/10/03(日) 17:28:53 ID:???]
- すいません。使用言語はPHP5.1.6です。
- 654 名前:652 mailto:sage [2010/10/03(日) 17:53:37 ID:???]
- 事故解決しました。
- 655 名前:nobodyさん mailto:sage [2010/10/20(水) 18:27:58 ID:???]
- 「/index.php/blog/new/id/17」
から、phpファイル名(/index.php)のみ削除するにはどうすればいいでしょうか? ファイル名は変わることがあります。
- 656 名前:nobodyさん mailto:sage [2010/10/20(水) 22:18:19 ID:???]
- s{/[^/]+?\.php}{}
- 657 名前:655 mailto:sage [2010/10/21(木) 01:50:09 ID:???]
- PHPのpreg_replace()に渡してみたのですが、
>Warning: preg_replace() [function.preg-replace]: Delimiter must not be alphanumeric or backslash in と言われてしまいます。。。
- 658 名前:656 mailto:sage [2010/10/21(木) 02:29:25 ID:???]
- どういう引数を渡したのかちょっと知りたい。
<?php $str = '/index.php/blog/new/id/17'; // $pattern = '/\/[^\/]+?\.php/'; // デリミタが / のときはエスケープ $pattern = '{/[^/]+?\.php}'; // デリミタは { と } $replace = ''; echo preg_replace($pattern, $replace, $str); ?>
- 659 名前:nobodyさん [2010/11/13(土) 19:09:08 ID:peMm7xtt]
- PHPで、例えば
こう言った文章を考えるのは、たのしい。 わたしは、「こんにちは」と言いました。 「この文章は、なかなか面白いですね。とても正確な正規表現を考える必要があるんです。」 「では、そんな正規表現をどうやって見つけるのでしょうか?そうだ、質問してみましょうよ!。」 「なるほど?。それは面白いアイディアだ。」と、もう一人は言った。 という文章があったときに、 "こう言った文章を考えるのは、たのしい。", "わたしは、","「こんにちは」","と言いました。", "「この文章は、なかなか面白いですね。","とても正確な正規表現を考える必要があるんです。」", "「では、そんな正規表現をどうやって見つけるのでしょうか?","そうだ、質問してみましょうよ!。」", "「なるほど?。","それは面白いアイディアだ。」","と、もう一人は言った。" という感じに分割して配列にしたいと思っています。 現在使っている正規表現は $contents = array(); preg_match_all('/.*?。|.*?「/m',$content,$contents); という感じで書いてみました。 $contentがもとの文章で、$contentsが新しく得る配列です。 どうも複雑でどうしたら良いのかわからないので質問させていただきます。よろしくお願いします。
- 660 名前:nobodyさん mailto:sage [2010/11/14(日) 09:26:59 ID:???]
- 一度にやろうとしないで分けてやればいいと思うよ
- 661 名前:nobodyさん [2010/11/14(日) 22:54:16 ID:xJLLsuw0]
- 正規表現での重複行の削除について
質問させてください みかん みかん みかん (空白行) りんご → りんご なし なし なし (空白行) なし (空白行) かき かき というかんじで 重複行は空白のままで残したいのですが どうすべきでしょうか?
- 662 名前:nobodyさん mailto:sage [2010/11/14(日) 22:55:28 ID:???]
- スクリプト言語でやったほうが楽じゃね?
- 663 名前:nobodyさん [2010/11/14(日) 23:35:35 ID:xJLLsuw0]
- できればこんなかんじで
エディタの検索置換でやりたいです ↓ d.hatena.ne.jp/seuzo/20080531/1212228668
- 664 名前:nobodyさん mailto:sage [2010/11/15(月) 00:12:15 ID:???]
- でこぽん
みかん りんご りんご みかん みかん りんご でこぽん こんな風に離れた行に重複がある場合はどうすんだろ?ソート済みなのかな。
- 665 名前:nobodyさん [2010/11/15(月) 00:48:49 ID:AfSBC14n]
- エクセルでソートしてあるます
- 666 名前:nobodyさん [2010/12/06(月) 23:51:24 ID:k5Tua1Td]
- メールアドレスが正しいかマッチング。
ただし、@gmail.com、@googlemail.com、@livedoor.comの場合は @の前に「+」「.」が含まれている場合は除外する。 これって正規表現1発でできたりしますか?
- 667 名前:nobodyさん mailto:sage [2010/12/06(月) 23:53:00 ID:???]
- yes
- 668 名前:nobodyさん mailto:sage [2010/12/08(水) 14:11:59 ID:???]
- メールアドレスの妥当性の判定はどのぐらい厳密にやるのだろう
- 669 名前:nobodyさん [2010/12/20(月) 16:51:11 ID:Qb400/Ia]
- php5で、tableタグ内の改行(<br />)を全て削除したいのです。
どうしたら良いんでしょう。 ●置換前 <table border="1" cellpadding="5" cellspacing="0" class="xx" id="xx"><br /> <tbody><br /> <tr><br /> <td><br /> </td><br /> </tr><br /> </tbody><br /> </table> ●置換後 <table border="1" cellpadding="5" cellspacing="0" class="xx" id="xx"> <tbody> <tr> <td> </td> </tr> </tbody> </table>
- 670 名前:nobodyさん mailto:sage [2010/12/20(月) 20:03:43 ID:???]
- >>669
str_replaceでおk
- 671 名前:nobodyさん mailto:sage [2010/12/20(月) 20:48:53 ID:???]
- 普通はstrip_tagsじゃね?
- 672 名前:nobodyさん mailto:sage [2010/12/21(火) 08:13:01 ID:???]
- テーブル外のbrは削除したくないんだろ
- 673 名前:nobodyさん mailto:sage [2010/12/24(金) 08:47:52 ID:???]
- この手のことをやりたい人は沢山いると思うので
散々既出の可能性がありますが、 参考ページでも構いませんので教えてください UWSCのコードを書くのにK2Editorを使っています 仕上げたコードの可読性をあげるために 演算子の前後にスペースを入れたいです 例 x+y=z x + y = z K2Editorの正規表現はBREGEXP.DLLを使っています 以下の置換をマクロで行います "([^ ])([\+\-\*<])","$1 $2" "([^ <])>","$1 >" "([\+\-\*=])([^ ])","$1 $2" "([^ <>])=","$1 =" "<([^ =>])","< $1" ">([^ =])","> $1" "([^ \/])\/([^\/])","$1 /$3" "([^\/])\/([^ \/])","$1/ $3" " "," " " +"," " "([,=\+\-\*\/\(<>]|mod|and|or|xor) - ","$1 -" 正規表現はド素人でネットで検索しながら書いたので まずい部分も多いと思いますがそれは置いといて、 本題はダブルコーテーションで括られた文字列内は 置換したくないのですが、何か方法はありますか?
- 674 名前:nobodyさん mailto:sage [2010/12/29(水) 07:28:15 ID:???]
- 性器表現難しいよね
- 675 名前:nobodyさん [2011/01/06(木) 22:08:59 ID:y0rS3N6j]
- 質問です。PHP5.3でpreg_matchを使っているのですが、例えば
「次章(第20条の3、第1節の3、・・・除き、建築基準法第80条の2にあっては・・・」 という文章より法律名称や条などをwhileループで拾い上げたいのですが、 /([第]*)([1-9]+[0-9]*)([条項号]+)[の]*([1-9]+[0-9]*)*[の]*([1-9]+[0-9]*)*(.*)/ で拾い上げると、法律名称(上の文章だと「建築基準法」)が抜けてしまうので /([建築基準法|建築基準法施行令]*)([第]*)([1-9]+[0-9]*)([条項号]+)[の]*([1-9]+[0-9]*)*[の]*([1-9]+[0-9]*)*(.*)/ と言う形で拾うと、なぜかpreg_match($match, $text, $arr)の$arrの中に、なぜか「第」という文字が拾われてきません。 これは何故なんでしょうか?? もし理由が分かる方がいらっしゃったら、お教え願います。
- 676 名前:nobodyさん mailto:sage [2011/01/07(金) 03:55:37 ID:???]
- 性器表現で痴漢する
- 677 名前:nobodyさん mailto:sage [2011/01/07(金) 03:58:44 ID:???]
- $text = '次章(第20条の3、第1節の3、・・・除き、建築基準法第80条の2にあっては';
$pat1 = '/([第]*)([1-9]+[0-9]*)([条項号]+)[の]*([1-9]+[0-9]*)*[の]*([1-9]+[0-9]*)*(.*)/'; $pat2 = '/([建築基準法|建築基準法施行令]*)([第]*)([1-9]+[0-9]*)([条項号]+)[の]*([1-9]+[0-9]*)*[の]*([1-9]+[0-9]*)*(.*)/'; preg_match($pat1, $text, $arr); var_dump($arr); preg_match($pat2, $text, $arr); var_dump($arr); array(7) { [0]=> string(62) "第20条の3、第1節の3、・・・除き、建築基準法第80条の2にあっては" [1]=> string(2) "第" [2]=> string(2) "20" [3]=> string(2) "条" [4]=> string(1) "3" [5]=> string(0) "" [6]=> string(53) "、第1節の3、・・・除き、建築基準法第80条の2にあっては" } array(8) { [0]=> string(62) "第20条の3、第1節の3、・・・除き、建築基準法第80条の2にあっては" [1]=> string(0) "" [2]=> string(2) "第" [3]=> string(2) "20" [4]=> string(2) "条" [5]=> string(1) "3" [6]=> string(0) "" [7]=> string(53) "、第1節の3、・・・除き、建築基準法第80条の2にあっては" } 第が拾われないってどこの話? あと関係ないけど複数拾いたいならpreg_match_all
- 678 名前:nobodyさん mailto:sage [2011/01/07(金) 08:16:20 ID:???]
- [マルチバイト] この時点でおかしいやろ
- 679 名前:nobodyさん mailto:sage [2011/01/07(金) 08:35:43 ID:???]
- u 修飾子つきじゃないのかな?
[第]* は量指定子も含めてどうかと思うけどね。
- 680 名前:nobodyさん mailto:sage [2011/01/07(金) 11:13:33 ID:???]
- PHPのPerl互換正規表現で、連続した文字を判定したい(3文字以上)
下のではだめ? preg_match("/(.)\1{3,}/", $hoge) 例→AAA、bbb、111、あああ他なら引っかかるようにしたい、ということ
- 681 名前:nobodyさん mailto:sage [2011/01/07(金) 11:42:34 ID:???]
- >>680
考え方はいいけど、最初の(.)で1文字食われるから繰り返し回数が 1回多い。それじゃ4文字以上になっちゃうぞ。
- 682 名前:nobodyさん mailto:sage [2011/01/07(金) 12:06:39 ID:???]
- >>681
4文字以上連続した文字だとしても、想定したように動かない・・・ ↓OK(Perl) my $hoge = 'aaaa'; if ($hoge =~ /(.)\1{3,}/) { print 'OK'; } else { print 'NG'; } ↓NG(PHP) $hoge = 'aaaa'; if (preg_match("/(.)\1{3,}/", $hoge)) { echo 'OK'; } else { echo 'NG'; } PHPは\1って表現できない?
- 683 名前:nobodyさん mailto:sage [2011/01/07(金) 12:28:18 ID:???]
- "..."の中だから¥¥1と書かないと駄目だろ。
- 684 名前:nobodyさん mailto:sage [2011/01/07(金) 13:39:43 ID:???]
- $hoge = 'aaaa';
echo preg_match('/(.)\1{3,}/', $hoge) ? 'OK' : 'NG'; // OK "\\1" か '\1' だよね。
- 685 名前:680 mailto:sage [2011/01/07(金) 14:21:39 ID:???]
- あたしばかよね・・・
ありがとうございました uも付けて完動です
- 686 名前:675 [2011/01/08(土) 22:00:49 ID:GTa36OYO]
- 返事遅くなりまして申し訳ありません。
/uを追加したら見事に機能しました。 というか、今までさんざん正規表現を日本語に適用していたのですが、/uのことを全く知りませんでした。 お恥ずかしい限りです。 お教えいただき、ありがとうございました。
- 687 名前:675 [2011/01/17(月) 22:15:13 ID:Br3WLX+O]
- 更に質問です。
「...にあっては国土交通大臣が定めた安全上必要な技術的のうちその指定するに係る部分に限る。)、第119条、第5章の4(第129条の2の5第1項の2第6号...」 という文章から、第○○条の○○の○○などを抜き取り、かつその前後の文章も取得したいと考えています。 そこで 「/^(.+)*([第])([1-9]+[0-9]*)*([条]+)[の]*([1-9]+[0-9]*)*[の]*([1-9]+[0-9]*)*(.*)/u」 というパターンでpreg_matchで拾いだそうと思うのですが、全く思うように拾いだせません。 何が問題なのでしょうか?? プログラムとしては、 <?php $text = 'にあっては国土交通大臣が定めた安全上必要な技術的のうちその指定するに係る部分に限る。)、第119条、第5章の4(第129条の2の5第1項の2第6号の文章'; print 'text : ' . $text . '<br>'; $match = '/^(.+)*([第])([1-9]+[0-9]*)*([条]+)[の]*([1-9]+[0-9]*)*[の]*([1-9]+[0-9]*)*(.*)/u'; print 'match : ' . $match . '<br>'; preg_match($match,$text,$arr); print 'arr : '; print_r($arr); print '<br>'; ?> こんな感じです。 もし分かる方がいらっしゃったら、お教え願います。
- 688 名前:nobodyさん mailto:sage [2011/01/17(月) 22:47:22 ID:???]
- 問題を切り分けてから質問してくれ
- 689 名前:マッチした文字列を小文字にしたい [2011/01/17(月) 22:59:46 ID:e71m2/yA]
- PHPにおける正規表現に関する質問です。
下のサンプルプログラムでは$3が両方とも大文字の「US」になりますが、 最初の$3だけを小文字の「us」にする方法があれば教えてください。 OSはWindows、PHPは5.3です。 元の文字列の例 Country: US 変換後に得たい文字列の例 Country: <a href="ja.wikipedia.org/wiki/.us">US</a> サンプルプログラム <?php $result = ''; $text = 'Country: US'; $pattern = '/(Country):(\s+)([A-Z]{2})/i'; $replace = "$1:$2<a href=\"ja.wikipedia.org/wiki/.$3\">$3</a>"; $result = preg_replace($pattern, $replace, $text); echo $result; ?>
- 690 名前:nobodyさん mailto:sage [2011/01/17(月) 23:51:56 ID:???]
- 手元のエディタでは\Lでできるんだけどな
PHPで使える置換パターンが良く分からない e修飾子つけちゃうとか
- 691 名前:689 mailto:sage [2011/01/18(火) 01:02:24 ID:???]
- そうですね。Perlだと\lで次の文字が小文字になるとかあるみたいですが、
PHPにはないんですかね? ほかの方法でもかまいませんので、 引き続き、回答をお待ちしております。
- 692 名前:nobodyさん mailto:sage [2011/01/18(火) 01:17:36 ID:???]
- >>689
$pattern = '/(Country):(\s+)([A-Z]{2})/ie'; $replace = '"$1:$2<a href=\"ja.wikipedia.org/wiki/." .strtolower($3). "\">$3</a>"'; 書いてみたら引用符がすっきりしない感じになってしまった。
- 693 名前:nobodyさん [2011/01/18(火) 19:32:41 ID:sm74ERjN]
- あの正規表現ですが、今までうまくつかえていないというか下手
です。で、勉強しようと思うのですが、 反復学習ソフト付き 正規表現書き方ドリル これいいですかね? オライリーとどっちがいいかなって思うんですけど。
- 694 名前:nobodyさん mailto:sage [2011/01/18(火) 22:59:06 ID:???]
- >>693
Webでおk
- 695 名前:nobodyさん mailto:sage [2011/01/19(水) 10:36:15 ID:???]
- >>693
良いと思うよ。 オライリーも良い本だけど、ひととおり基礎ができてからで良いと思う。
- 696 名前:689 mailto:sage [2011/01/19(水) 21:20:53 ID:???]
- >>692
できました。 ただ、「DO」というドミニカの国別コードの時、予約語と重なってエラーになったので、 ダブルクォートにしました。 $pattern = '/(Country):(\s+)([A-Z]{2})/ie'; $replace = '"$1:$2<a href=\"ja.wikipedia.org/wiki/." .strtolower("$3"). "\">$3</a>"'; どうもありがとうございました。
- 697 名前:nobodyさん mailto:sage [2011/01/19(水) 21:48:50 ID:???]
- >>690でe修飾子と言っているのに
- 698 名前:nobodyさん [2011/01/19(水) 23:40:21 ID:zqG6AlFK]
- 抽象的な質問で申し訳ないんですが、本の話が出たのでついでに伺いたいんですが。
今まで表計算ソフトやデータベースソフトなど普通に習得し、 更に興味が出てきたのでMySQLとPHPを使ってプログラミングしたり、 apacheやPostFixなども何とか使えるようになり、何となく分かってきた感じがしてるのですが、 正規表現に関しては、未だに「どうにか使っているけど、理解は出来ていない感じ」がします。 とりあえずやってみて、だめで違う手を試してみたりして.... まるで別種類な考え方が必要な気がします。 なので質問なのですが、正規表現を理解するのに一番良い本とか、 正規表現について「目から鱗が落ちた!!一皮むけた!!理解が深まった」 って思えるような本とかあったら、紹介いただけないでしょうか?? それとも忍耐強く、失敗しては考える繰り返しでなければ、習得できない物なのでしょうか?? 当方今年で三十路なので、頭が固くなってきてるのかもしれませんが、いまいち頭にしみ込みにくくなってるような気がしてます。 もしよろしければお教え願います。
- 699 名前:nobodyさん mailto:sage [2011/01/20(木) 00:05:42 ID:???]
- >>698
何となく分かった気になっている時は何も分かってないからもっと簡単なのからやれ
- 700 名前:693 [2011/01/20(木) 01:01:52 ID:973KUxXQ]
- >>695
ありがとうございます。 基礎から勉強したいので、買います。
- 701 名前:nobodyさん mailto:sage [2011/01/20(木) 13:16:18 ID:???]
- 正規表現のスレ (プログラム板や UNIX 板にもある) のログを見て、
質問のお題を片っ端から解いていくと、結構良い練習になると思う。
- 702 名前:nobodyさん [2011/01/20(木) 23:13:37 ID:LxK6uyro]
- 次の正規表現でhogeフォルダ以下の最後の「/」の後に「i/」が挟まるようにURLを変換しております。
RewriteRule ^/hoge(.*)/(.*).html$ example.com/hoge/$1/i/$2.html [L] 下記のような場合は問題ないのですが example.com/hoge → example.com/hoge/i/ example.com/hoge/saitama/2011/01/index.html → example.com/hoge/saitama/2011/01/i/index.html ↓のようにhogeで始まるディレクトリまでも変換されてしまいます。 example.com/hogehoge/kankeinai.html hogeフォルダ配下のみ変換されるようにするには、どうしたらいいでしょうか? 環境は CentOS5 Apache2
- 703 名前:nobodyさん mailto:sage [2011/01/21(金) 00:15:43 ID:???]
- /hoge/(.*)〜にすればいいじゃん
- 704 名前:nobodyさん mailto:sage [2011/01/21(金) 18:26:53 ID:???]
- >>698
頭の良い人だとまた違うのかもしれないけど、 我々のような凡人は繰り返しやって経験値を積むしかないかなあ、って気がする。 で、何か読んで一つ山を越えたいなら、現状ではオライリー本の一択しか無いと思う。
- 705 名前:nobodyさん mailto:sage [2011/02/10(木) 13:57:44 ID:???]
- 対象の文字列にハングル文字が含まれるかどうかを判断したいのですが
よい方法が思い浮かびません。 javascriptです。
- 706 名前:nobodyさん [2011/02/27(日) 08:37:54.94 ID:GexZY7hJ]
- 1. preg_match('/[\(]{2}?(.*?)\:(.*?)[\)]{2}?/', $text, $match)
この変換を変数展開で実行したいのですが、 正規表現で使える記号の変数展開のやりかたを教えてください。 2.$exprString = '/[\(]{2}?(.*?)\:(.*?)[\)]{2}?/'; preg_match("/$exprString/", $text, $match); これだとうまく行きません。
|

|