09/10/06 22:32:03
phpのpreg_matchなのですが
文字列の中のURLからホストを取得するのは解るのですが
ホスト名とその後に続くディレクトリ名を取得する方法を教えて下さい。
$url = "URLリンク(hogehoge.com)";
これならば
URLリンク(hogehoge.com)の部分です。
お願いいたします。
565:nobodyさん
09/10/13 11:08:03 8X+N74J6
phpで、いくつか特定の拡張子を持つファイルをマッチさせたいのですが、
最後を意味する$は下記のように最終的に1つでよいですか
if (preg_match("/\.html|\.php|\.txt$/",$value)) {
$chk = 1;
}
それともこのように全部に$が必要ですか?
if (preg_match("/\.html$|\.php$|\.txt$/",$value)) {
$chk = 1;
}
566:nobodyさん
09/10/13 11:28:58
>>564
parse_url使うか"/(.*)\//"
>>565
やってみればわかることだけど当然全部に必要
だから\.(html|php|txt)$みたいに括弧でくくるのが常套だけどマッチした値を取得する必要ないなら
\.(?:html|php|txt)$と書いて少し軽くできる
567:565
09/10/13 12:34:51 8X+N74J6
>>566
ありがとうございました( ^ω^)
568:nobodyさん
09/10/14 08:58:15
perl で,
「<と>で囲まれた文字列内の abc を def に全て置換する」
というのは正規表現でどう書けばよいでしょうか。
マッチだけならば
"<asaabcasalaabca>" =~ /\<(.*?)(abc(.*?))*?\>/
のようにしてマッチさせられるのですが,繰り返しがあるので後方参照で取得できません。
569:nobodyさん
09/10/14 09:18:20
>>568
せっかくperlでプログラム書けるんだから、
1. 「<」と「>」に囲まれた文字列を取り出す
2. 1で取り出した文字列のabcをdefに置換
3. 2の結果を「<」「>」で挟む
とやれば難しいことは何もない。
570:568
09/10/14 10:26:28 6OWMkMrw
>>569
いや,確かにおっしゃるとおりなのですが,
Perl互換の正規表現を採用しているエディタで文章を打っているときに,
いちいち使い捨てのPerlスクリプトを作るのが面倒で,
せっかくエディタに内蔵されている正規表現置換機能で置換できれば便利なのにな……と思った次第です。
571:nobodyさん
09/10/14 10:46:05
そりゃそのエディタの説明書に書いてあるだろ
572:nobodyさん
09/10/14 16:45:59
「< と > で囲まれた文字列内のある一つの abc を def に置換する」を、
そのエディタのキーボードマクロ機能で繰り返し適用すればよくね?
573:nobodyさん
09/10/14 17:59:48
いや、そのエディタに正規表現での置換機能もあるだろ、普通
574:nobodyさん
09/10/14 18:10:49
置換というか補完じゃね?
575:572
09/10/14 18:34:24
>>573
エディタの置換機能だと複雑なことができない (この場合 < と > の間を繰り返し置換)
からどうすればいいの?っていう質問だと思ったんだが、違うのかな?
どのエディタ使ってるとか晒してくれるともっと的確に答えれる香具師がいそうだが。
576:568
09/10/14 23:09:15
>>571-574
いえ,ですから,エディタ(Mac OS X の Jedit X です)に正規表現置換機能が備わっていることは分かっています。
その正規表現の書き方を知りたいのです。
「< と > の間の繰り返し置換」は正規表現では実現不可能,ということであれば,
やむを得ずスクリプトを組みます(Perl あるいは Jedit X のマクロ言語である AppleScript)が,
可能であれば正規表現置換で実現したいのです。
やはりエディタウィンドウ内で完結するのは手軽ですので。
先読み・後読みや再帰を利用した超絶技巧的正規表現でも構いません。アイデアを求めています。
577:nobodyさん
09/10/15 00:24:07
>>568=570=576
テキストエディタの実装する正規表現には方言がある。
ここで尋ねても埒が明かない可能性が大なので、新Mac板の専用スレッドに引っ越すことを推奨。
Mac用テキストエディタ Jedit X / 1.0~4.0
スレリンク(mac板)
578:nobodyさん
09/10/15 13:12:35
>>576
Perlでしてみた。
そのエディタは後方参照はできるんかな?
my $str = "<asaabcasalaabca>";
print $str, "\n";
$str =~ s/((?:<|\G).*?)abc(?=.*?>)/\1def/g;
print $str, "\n";
579:578
09/10/15 13:19:37
>>568のケースだけなら大丈夫だけど、汎用的には不具合がありそうなので取り消し
580:578
09/10/15 13:37:10
試行錯誤した結果、以下でいけそうな感じだけど、どうだろう?
$str =~ s/((?:<|\G)[^<>]*?)abc(?=[^<>]*>)/\1def/g;
581:nobodyさん
09/10/15 13:51:05
utf-8の文字コード内にない文字を探すにはどんな感じにすればいいんでしょうか?
javascriptです。
582:nobodyさん
09/10/15 20:38:57
>>568
Perlだったら。
s/<(.*?)>/(my $s = $1) =~ s{abc}{def}g; "<$s>"/ges;
エディタのマクロでやるのがいいかなと思うけど、ちょっと面倒。
583:nobodyさん
09/10/19 23:25:42 /Zspq1xO
PHPでとあるファイルを読み込んで、読み込んだファイルの中に下記の記述
があれば正規表現(preg_replace等)で空白に置き換えたいと考えています。
正規表現で正規表現を消す記述の仕方がわかりませんorz
どのような正規表現を記載すればよいでしょうか。
すみませんがお分かりになられる方が居られましたらご教授よろしくお願いいたします。
↓↓↓消したい記述その1↓↓↓
if ( /^(To|Cc): admin@admin\.com$/:h || /^(To|Cc): .*\<admin@admin\.com\>/:h )
{
cc \"| /usr/bin/nextbb -c ISO-2022-JP -s 'xxxxx' -A 'From:yyyyy <admin@admin.com>' -t
/home/sendmail -t\"
}
↓↓↓消したい記述その2↓↓↓
/^[a-zA-Z0-9\-\.\/\[\]\(\)\{\}\|@`:<>,!?\"'#\$%&*+;\\=^_~ ]*?$/"
584:nobodyさん
09/10/19 23:36:46
Linuxコマンドが入力されるインプットボックスの入力チェック処理を
正規表現でやりたいのですが、どのようなチェックを行えばいいでしょうか?
585:nobodyさん
09/10/20 09:19:58
それはキミがどのような入力を許可したいかがわからないから答えようがない
586:nobodyさん
09/10/23 15:06:47
それを聞いているんじゃないのか
587:nobodyさん
09/10/23 17:07:26
Linuxコマンドとか、インプットボックスって何?
588:nobodyさん
09/10/24 13:30:39
<input>で何か入れてsubmitすると、それが実行されるのか?
なんか巧妙にうまくごまかして危険なコマンド実行されそうだな。
正直俺の知識では知らん。
どんなコマンドも受け付けたくないな。
そもそもコマンドによってチェック内容は変わるんじゃないの?
589:nobodyさん
09/10/24 18:23:59
<input name="cmd" type="text" value="rm -rf ." />
590:nobodyさん
09/10/25 08:12:45
>>584
俺はこれからどのように生きていけばいいでしょうか?
くらいに漠然とした質問だなこりゃ。
構文的に shell が受理可能かどうかなら Perl なら shellwords.pl 使うとかな。
591:nobodyさん
09/12/09 19:11:48
まだ正規表現が素人なので教えてください。
たとえば以下のように四行の文章があって
それら文章の最初(一番目)の空白文字だけを検索するには
どうすればいいのですか?
The environment of contents industries is so drastically changing,
though Japan has not fully.
taken advantage of the changes to develop.
its presence in the global market.
The とenvironmentの間の空白文字 、though と Japanの間
taken とadvantage の間の空白文などなどです
592: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>