正規表現道場at PHP
正規表現道場 - 暇つぶし2ch592:nobodyさん
09/12/09 21:08:56
Perlで関数の括弧をドンドン入れ子にしていく正規表現書いてるだけと
(\([^()]*(((\([^()]*\)[^()]*))*\)[^()]*)*)*\)
↑これに穴は無いよな!?
どんなに入れ子にしても、エラーはでないかな
初めて作った正規表現なんだが。ご指南、よろ

593:nobodyさん
09/12/20 20:33:27 fe9ijwb+
0*(\d+)

これの意味を教えてください

()の中はわかるのですが前がよくわかりません

594:nobodyさん
09/12/20 20:38:26
数字の並びから先頭の0を取り除いてる

595:nobodyさん
09/12/20 20:44:43 fe9ijwb+
なるほど
00200 とかの前の0を無視して検索できるという感じですか

596:nobodyさん
09/12/21 08:18:48
>> 0*(\d+)
0が0個以上並んだ後に、0~9が1個以上並ぶ。

597:nobodyさん
09/12/21 20:42:38
>>592
見てないけど無理
(??{})あたり使えばいける

598:nobodyさん
09/12/23 22:25:52 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さん
09/12/23 23:13:19
$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さん
09/12/29 00:08:08 F3P1tBWB
文字列の中にある¥を除去したかったのですが、preg_replace('/¥/')や
preg_replace('/¥¥/')では削除できなかったのですが、preg_replace('/¥¥¥/')だと削除できました・・・
これはなぜでしょうか。
¥は次に有る文字をエスケープするわけですから、preg_replace('/¥¥/')でいけそうな気がするのですが。。。
正規表現初心者につき、低レベルですがご教授よろしくお願いいたします。
(上記は、あえて半角ではなく、全角の¥で説明しています。)



601:nobodyさん
09/12/29 12:06:00
やりたいこと自体はstr_replaceでできるだろうけどphpの正規表現がなんかおかしいな。
perlならそれで通るはずだけど。

602:nobodyさん
09/12/29 12:38:00
文字列としてのエスケープと正規表現としてのエスケープは別。
'/\\/' は /\/ '/\\\/' は  /\\/ '/\\\\/' も /\\/  



603:600
09/12/29 22:52:30 F3P1tBWB
>>601-602
なるほど!!
そういうことでしたか。
ありがとうございます!

604:nobodyさん
09/12/30 09:01:55
ああそうか、phpだとシングルクオートで囲んでも\はエスケープに解釈されるのか。

605:nobodyさん
10/01/24 19:36:14
<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さん
10/01/24 20:12:18
複数ならpreg_match_all()使うけど一つならpreg_match()で以下のように

preg_match('/\bid=(\d+)[^>]+>([^<]*)<\/a>.*?"id">\1<.*?"time">(\d+)<.*?"name">([^<]*)<.*?"body">([^<]*)</is', $s, $match);

607:nobodyさん
10/01/24 21:01:02
有難うございます。
IDが0001以外のコメントもひろっちゃっていますが、かなり希望するのに近づいてきました。

もう少し細かく書くべきでしたが、複数のIDがあり、同じIDでのコメントも複数あった場合です。
上記のタグが一つのセットとして、いくつかある中の
<a href="test.php?id=0001">あいうえお</a>のタグとコメント部分をまとめて表示させたいと思っています。
id=の部分を改変して直接0001を指定したらだめだった・・・

608:nobodyさん
10/01/25 01:28:52
試行錯誤したらなんとか希望通りのものができました。
正規表現だけに囚われててプログラムがよろしくなかった…

609:nobodyさん
10/02/03 12:34:08
先生質問です
Rewriteで動的URLを静的URLにしたいのです

やりたいことは6つのクエリを書き換えたいのですが
6つのうち1つのとき、2つのとき、・・・6つのときというように組み合わせがかなりの数になってしまうと思うのですが

順列で 6P1 + 6P2 + 6P3 + 6P4 + 6P5 + 6P6 と考えてよいのでしょうか?

6つも書き換えなんてやっぱ無理でしょうか?

610:nobodyさん
10/02/03 13:22:42
ちょw

611:nobodyさん
10/03/02 21:59:18
 

612:nobodyさん
10/03/02 22:11:34
test

613:nobodyさん
10/03/08 15:33:08
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さん
10/03/08 18:01:54
たぶんs/`(\w+)`/`\U$1`/g

615:nobodyさん
10/04/11 00:10:39
eregで半角記号のみをマッチさせてfalseを返す処理を組んでいるのですが、
何故か一部の漢字が引っ掛かってしまいます…確認した所では夕焼けの「夕」の
文字などです。

if(ereg ("[[:punct:]]",$_POST['名前']))

こんな感じです。今までは普通に機能していたんですが…
どなたかアドバイス頂けないでしょうか?

616:nobodyさん
10/04/11 02:49:42
>>615
ereg って多バイト文字に対応してないんじゃないか?


617:nobodyさん
10/04/12 09:23:26
eregはPHP5.3.0から非推奨になってるので新しく書くプログラムでは
使わないほうがいいよ。perl互換正規表現(PCRE)をお使いください。

618:nobodyさん
10/05/02 00:32:33
: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さん
10/05/02 04:08:13
>>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さん
10/05/02 04:53:21
>>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さん
10/05/02 10:16:16
>>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さん
10/05/02 11:44:31
>>619-621
そうか、未来の拡張を考えて緩くしたけど、
2バイト文字以外のブログじゃ広くマッチしすぎるって事か。。。
それじゃスマイリーコードの方に厳格なルールを...
なんって考えるのもユーザーに優しくないし。
折り合いつけるの難しいね :|



623:nobodyさん
10/05/02 19:52:37
>>622
厳格さが必要でない処理が行われるというのがイメージできんのだけど、
マッチさせてどうしたいんだ?

624:nobodyさん
10/05/02 20:21:19
>>623
とあるCMSで、
引用表示の時は、リンクとか画像とか取っ払う追加プログラム書いてるから。

625:nobodyさん
10/05/02 22:35:26
>>624
文から推測すると、前提として普通の記事の場合はスマイリーコードとやらが画像に変換されるということがあって、
その記事が引用されてる場合はそれらを除去したいということか?

前提が正しいならスマイリーコードを画像に変換する時に使ってるルールを厳格に使うべきだし、
正しくないならリンクでも画像でもないスマイリーコードを除去する必要がないと思うんだが

626:nobodyさん
10/05/02 23:09:45
>>625
正解です。
通常記事ではスマイリーコードが画像に変換されます。
で、引用時には、それら(改行,スペース,タブ,画像,リンク等)を除去して
コンパクトにしたいのです。

引用文にスマイリーが入ってもいいんですが、
記事を丸める過程で<img>タグが邪魔したので、除去するを仕様としました。


627:nobodyさん
10/05/03 00:05:08
>>626
一度img要素に置換したものをベースにするというのがそもそもおかしいのでは?
もしかして表示する直前に置換してるんじゃなくて、DBに突っ込む段階で置換しちゃってるとか?
それだったら設計を見直したほうがいいと思うんだけど

628:nobodyさん
10/05/03 00:07:04
>>626
じゃあやっぱり >スマイリーコードを画像に変換する時に使ってるルールを厳格に使う が一番スマートなんじゃないか
それができないなら一旦引用されていない記事として処理して、そこからimgタグを除去するとか

正規表現の話からはだいぶそれたので俺はこれ以上何も言わないことにするよ :P

629:nobodyさん
10/05/03 00:36:11
>>627-628
スマイリーコードが置換されるのはDBから引っ張ってからですが、
追加プログラムの導入IDによって優先順位があるので単純ではないんです。。。

で、私も正規表現から脱線しすぎなのでこれが最後。

脱線ついでに、タイムズスクウェアで爆発物を積んでた車って。。。
家の車も正規表現でマッチしちゃうwww


630:nobodyさん
10/05/19 16:47:15 t/z/xcK5
質問させてください!

ああああああ @ ABCD @ abcd

という文字を

<b>ああああああ</b> @ ABCD @ <em>abcd</em>

のように置換したい時はどういう正規表現を使えばいいのでしょうか?

よろしくお願いいたします

631:nobodyさん
10/05/19 17:44:20
その例にするための条件って何?
スペース @ スペース が区切りとか?

632:nobodyさん
10/05/20 19:43:15 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
10/05/20 19:44:24
途中で投稿してしまいました。

お手数ですがご教授よろしくお願いします。
なお、当方18歳女子になります。

634:nobodyさん
10/05/20 19:54:06
<th>名称1</th><td>(.*?)</td>

635:nobodyさん
10/05/20 20:40:36 a5arSWsA
URLリンク(www19.atpages.jp)
URLリンク(ukiya.sakura.ne.jp)
URLリンク(ukiya.sakura.ne.jp)


636:nobodyさん
10/05/20 21:13:11
<th>名称1</th><td>(値1|<img>)</td>

637:632
10/05/21 22:05:20 E8tDrX2s
ありがとうございました。
無事に解決できました。
これより踊りに行くのでこれにて失礼致します。

638:nobodyさん
10/05/24 12:25:48
便乗だけど
<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さん
10/05/24 14:40:31
<th>名称1</th><td .*?>(.*?)</td>


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch