• 締切済み

HTMLタグを取得する正規表現

HTMLタグを取得する正規表現が出来ず、困っています。 <b><a href="http://aaa.ccc.co.jp">あいうえお</a></b> このような文字列であった時、 「<b><a href="http://aaa.ccc.co.jp">」を取得したいのです。 プログラムで制御する事も含め、以下のような動作を望んでいます。 1.「<b><a href="http://aaa.ccc.co.jp">」を取得する 2.対象文字列を「あいうえお</a></b>」にする 3.「あいうえお」を取得する 4.対象文字列を「</a></b>」にする 5.「</a></b>」を取得する やりたい事は「実際の表示上の文字数で文字数制限を行い、制限分の文字列を出力する」です。 なので、もし上記のような事をやる必要ないというのなら、その手段もご教示頂ければと思います。

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>やりたい事は「実際の表示上の文字数で文字数制限を行い、制限分の文字列を出力する」です。 意味がよくわかりません。 「表示上の文字数」というのは「あいうえお」で5文字ということですか? 文字数であってバイト数でなくてよいのですか? それをどう「制限」して、どう「出力」するのですか? とりあえず1~5に関してはこんな感じで、4と5は同じなので割愛。 <?PHP $str1=<<<eof <b><a href="http://aaa.ccc.co.jp">あいうえお</a></b> eof; print "Org.".htmlspecialchars($str1)."<br>"; preg_match("/(<b><a [^>]+>)/",$str1,$match); $str2=$match[1]; print "1.".htmlspecialchars($str2)."<br>"; $str3=str_replace($str2,"",$str1); print "2.".htmlspecialchars($str3)."<br>"; preg_match("/([^<\/a><\/b>]+)<\/a><\/b>/",$str3,$match); $str4=$match[1]; print "3.".htmlspecialchars($str4)."<br>"; $str5=str_replace($str4,"",$str3); print "4.".htmlspecialchars($str5)."<br>"; ?>

naktak
質問者

補足

すみません、質問内容に不備がありました。 HTMLタグの存在は可変であり、エレメントもAやBだけとは限りません。 「表示上の文字列」とは「あいうえお」ですが、 それを表示する時の全てのHTMLは「<b><a href="​http://aaa.ccc.co.jp">​あいうえお</a></b>」です。 バイト数ではなく文字数です。 つまり、「<b><a href="​http://aaa.ccc.co.jp">​あいうえお</a></b>」という文字を 解析して、表示文字制限が5文字であった時、実際にユーザーに 文字列として出力される部分である「あいうえお」(HTMLのエスケープはしません) の文字列を5文字出力し、かつ「あいうえお」はHTMLタグ内に 存在している為、「あいうえお」を囲っているHTMLも出力します。 これが1~4文字という表示文字数制限であった時、「あいうえお」は 1~4文字という制限に満たない為、HTMLも含め何も出力されません。 それを行う為、HTMLの開始部分と文字列、HTMLの終了部分を 別々に取り出して文字数を算出し、出力すべきHTMLを生成したい、 という結論に達しています。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 簡単でお恥ずかしいのですが・・正規表現

    文字列:aaa="あいうえお" bbb から あいうえお だけ、抽出したい $a= "aaa=\"あいうえお\" bbb"; mb_ereg("aaa=\"(.*)\" bbb",$a,$b);  print "$b[1]"; ではうまいてきません。 $a= "aaa=\"あいうえお\" bbb"; mb_ereg("aaa=\"(.*)bbb",$a,$b);  print "$b[1]"; では、 あいうえお" になってしまいます。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • URLを見つけたら自動でリンク、タイトルを取得する

    よろしくお願い致します。 ------------- 引用元:http://aaa、http://bbb、http://ccc ------------- という文字列がある場合 ------------- 引用元:<a href="http://aaa" target="_blank">タイトルaaa</a>、<a href="http://bbb" target="_blank">タイトルbbb</a>、<a href="http://ccc" target="_blank">タイトルccc</a> ------------- に置き換える方法を考えています。 ------------- <?php // 対象文字列 $text = '引用元:http://aaa、http://bbb、http://ccc'; // パターン $pattern = '/((?:https?|ftp):\/\/[-_.!~*\'()a-zA-Z0-9;\/?:@&=+$,%#]+)/u'; // 置換後の文字列 $replacement = '<a href="\1">\1</a>'; // 置換 $text= preg_replace($pattern,$replacement,$text); // 出力 echo $text; ?> ------------- で ------------- 引用元:<a href="http://aaa" target="_blank">http://aaa</a>、<a href="http://bbb" target="_blank">http://bbb</a>、<a href="http://ccc" target="_blank">http://ccc</a> ------------- までは行けたのですが、タイトルを取得する方法が分かりません。 http://otapps.net/archives/305 こちらを参考に考えたのですが、先に進めずにいます。 分かる方がいらっしゃいましたら、ご教示ください。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 正規表現でシングルクォーテーションで囲まれた文字列

    VB.NET で開発を行っています。 シングルクォーテーションで囲まれた文字列の検索を行いたいのですが正規表現の記述が良くわからないので困っています。 たとえば 'AAA' + 'BBB' + 'CCC' 上記のの文字列から「'AAA'」「'BBB'」「'CCC'」も検索したいのですが,パターンとして「'.*'」を用いると「'AAA' + 'BBB' + 'CCC'」が返ってきます。 どなたかご教授ください。よろしくお願いします。

  • 正規表現

    正規表現 a=/home/aaa/bbb/ccc/ddd.abc echo ${a%.abc}実行したら /home/aaa/bbb/ccc/ddd が表示されますが、 home/aaa/bbb/ccc/ddd に表示したいですがうまくいきません。 ネットで正規表現さがしてみたけど理解できませんでした。 教えていただきたいです。なお 説明文も簡単に記入していただいたら幸いです。

  • Perlの正規表現について

    Perlの正規表現について質問です. ■質問 aaa bbb aaa bbb ccc "ddd" aaa bbb ccc "ddd eee" aaa bbb ccc ddd eee "fff ggg hhh iii" というような,文字列が書かれているファイルがあるとします. ※ダブルクォーテーションが無い行もあります. ※ダブルクォーテーション内のスペースの数は,行によってそれぞれ異なります. これを,ダブルクォーテーションの中にあるスペースだけ アンダーバーに置換する場合の正規表現を教えて下さい. つまり,下記の出力にしたいです. aaa bbb aaa bbb ccc "ddd" aaa bbb ccc "ddd_eee" aaa bbb ccc ddd eee "fff_ggg_hhh_iii" ■条件 ※ちょっと古いPerlでも動くよう,ゼロ幅肯定/否定後読((?<),(!<))は使わないでください. ※単に実現するだけなら, # cat inputfile | print -pe 'sub f(){}(shift;s/ /_/;return $_;); s/(\".*\")/&f($1)/e;' みたいな感じで置換できそうですが,「正規表現だけで簡単に書けるかどうか」が知りたいのです(正規表現だけで実現出来る場合,そのアルゴリズムを知りたいです).そのため,関数と/eオプションは使わないでください.

    • ベストアンサー
    • Perl
  • 正規表現でタグの一部を削除したい

    Dreamweaverの検索および置換で正規表現を使用して、サイト内で使用されている<a>タグの中の「title=""」を削除したいです。どうぞよろしくお願いします。 例としては下記のような感じです。 【修正前】 <a title="ここは文字列が入っています" href="index.html" class="link">リンク文字</a> 【修正後】 <a href="index.html" class="link">リンク文字</a> 「title=""」の「””」に入っている文字列は同じ文字もありますが、基本的にすべて違います。 また、例では<a>タグの中に「href」「class」が入っていますが、リンク先が違ったり、class名が違ったり、「id」が入っていることもあります。

    • ベストアンサー
    • CSS
  • 正規表現 画像リンクのaltの取得

    正規表現 画像リンクのaltの取得 正規表現初心者です。 PHPでHTMLからリンクが設定された画像の alt とリンク先URLを取得するパターン作成に悪戦苦闘しています。 やりたいこと ページ上の画像(<img>)のalt のテキストを取得する。 ただし<img>タグはアンカー<a></a>で囲まれたリンクが設定されているもののみ。 要はリンクURLとaltテキストの組み合わせリストを作成することを目的としています。 ためしたこと 検索(PHPのpreg_match_allで)以下のパターンで取得を試みました。 #<a\s[^>]*?href\s?=\s?[\"\'](.*?)[\"\'].*?><img\s[^>]*?alt\s?=\s?[\"\'](.*?)[\"\'][^>]*?>#i このパターンで実行した場合.*?の指定があだとなったようで範囲が拡大され、たとえば以下のようなパターンにもヒットししまいます。 <a href="aaa">bbb</a><a href="ccc"><img alt="ddd"></img></a> これだと URL "aaa" に対するaltテキストが"ddd"という結果がになってしまい事実との矛盾が生じます。 勉強不足で恐縮ですが、アドバイスいただければ幸いです。よろしくお願いします。

    • ベストアンサー
    • PHP
  • ''で囲まれていない文字列にマッチする正規表現

    下記のような文字列($str)に対して置換を行い、 my $str = qq{ AAA = BBB - 'CCC' }; $str =~ s/★正規表現★/sprintf("DDD(%s)",$1)/xmsge ; 変換後 $str = DDD(AAA) = DDD(BBB) - 'CCC' ; を実現する★正規表現★を書きたいと思っています。  ・AAA,BBB,CCCは[\w]で構成される文字列です。 ですが、シングルクォーテーション('')で囲まれていない文字列にマッチする正規表現が書けなく困っています。 一度、シングルクォーテーションで囲まれているものも含めて全てDDD()をつけて、そのあとで、シングルクォーテーションを含むものは元に戻すことでやりたいことは実現できているのですが、1行で実現できる方法を探しています。 アドバイスよろしくお願いします。

    • ベストアンサー
    • Perl
  • 正規表現を教えてください。

    正規表現を教えてください。 C#で正規表現を用いた文字列検索を勉強中なのですが、うまくマッチさせることができません。教えていただけないでしょうか。 検索対象の文字列は下のようになります。 キーワード;値; 文字列中に該当するキーワードが存在する場合に、その値を取得するプログラムを考えています。しかし、私の正規表現では2つ目の「;」を検出してしまい、キーワードのみを取得することが出来ずに困っています。 見当違いの表記をしているとは思うのですがどなたかお助けください。 match = Regex.Match(line, "^(.*);"); C#初心者なものです。

  • HTMLのソースの取得・正規表現

    プログラム自体始めて間もない初心者です。 javascriptでHTMLのソースを取得して、正規表現でマッチしたURLを書き出したいと思います。 取得したソースから正規表現で抽出はできましたが、さらに手を加えると機能しませんでした。 下記test-1では「http://abc.com/」と表示されましたので思った通りに動きました。 しかし、test-2では「http」と表示されると思っていたところ、表示されませんでした。 この違いはなんでしょうか? //////////////////// test-1 <html> <head> <script type="text/javascript"> function test(){ aaa = document.getElementsByTagName("html")[0].innerHTML; bbb = aaa.match(/http:\/\/abc\.com\//); document.write(bbb); } </script> </head> <body> <input type="button" onclick="test()"> <a href="http://abc.com/"> </body> </html> //////////////////// test-2 function test(){ aaa = document.getElementsByTagName("html")[0].innerHTML; bbb = aaa.match(/http:\/\/abc\.com\//); ccc = bbb.match(/http/); document.write(ccc); }