正規表現によつHTMLタグの取得(スタイル含む) - PHPプロ!Q&A掲示板

2686

  • 0P

正規表現によつHTMLタグの取得(スタイル含む)

質問日時 / 2010年4月19日 18:26    回答数 / 5件

Questioner:  takeHo  このエントリーをはてなブックマークに追加 

キーワード / 正規表現    タグ取得    HTML   

表題の件につきまして、ご質問させて頂きます。

  1. <div style="text-align:center"><span style="color:#ff0000;font-size:smaller;">表示テキスト</span></div>
のHTML内の
「span」タグに含まれるスタイルシートの「color:#ff0000;font-size:smaller;」だけを正規表現で取得するにはどうすれば良いでしょうか

とりあえずは、
  1. preg_match( '/(?is)(<span\s*style="[^>]*.{1})/', $value );

で、「span」タグの存在確認をする事ができました。
「style」の中身は、それぞれ異なるので、正規表現にて取得しなくてはならない為、現在表現方法に頭を悩ませております。

情報をお持ちでしたら、何卒ご教授の程宜しくお願い致します。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01shimixpreg_matchを使っているのでしたら、第三引数($match
┣A02yuu_a0>>CODE $html =<<<EOD ・・・ <div style="text-al
┣A03fedora6>>CODE $buffer = '<div style="text-align:center">
┃┗A03-1yuu_a0>>CODE preg_match('/<span\\s+[^>]*style=(\'|")(
┣A04magicflute2この意見は投稿者によって削除されました。
┗A05yuu_a0あ~ http://www.phppro.jp/qa/2684 の続きね。 動

回答一覧

並び替え:

A01
answerershimix [4月19日 21:38] (最終編集:4月19日 21:39)

preg_matchを使っているのでしたら、第三引数($matches)を指定してマッチした部分を取り出してみてはどうでしょう。

  http://jp.php.net/manual/ja/function.preg-match.php

あ、preg_match_allの方がいいかも(汗

  http://jp.php.net/manual/ja/function.preg-match-all.php

あとはstyle=までと最後の>あたりを切り取れば(&前後の引用符をカットすれば)いいんじゃないでしょうか?こちらはstripossubstrだけでいけそうですけど。

この意見に回答する

ツリーへ TOPへ

A02
answereryuu_a0 [4月20日 02:45] (最終編集:4月20日 03:56)

  1. $html =<<<EOD
  2. ・・・
  3. <div style="text-align:center"><span style="color:#ff0000;font-size:smaller;">表示テキスト</span>< /div>
  4. ・・・
  5. EOD;
  6.  
  7. $doc = new DOMDocument();
  8. $doc->loadHTML($html);
  9.  
  10. $xpath = new DOMXPath($doc);
  11. $result = $xpath->evaluate('//div/span/@style');
  12.  
  13. echo $result->item(0)->nodeValue;

# DOMXPath::evaluate はしょぼいので、ラッパー被せたほうがいいかもしれません。
# ついでに DOM CSS もほしかったりするので、誰か作って。

この意見に回答する

ツリーへ TOPへ

A03
answererfedora6 [4月20日 21:11]

  1. $buffer = '<div style="text-align:center"><span id="spanid" style="color:#ff0000;font-size:smaller;" title="spantitle">表示テキスト</span></div>';
  2.  
  3. preg_match('/<span\s[^>]*style=(\"??)([^\" >]*?)\\1[^>]*>/siU', $buffer, $match);
  4.  
  5. print_r($match);
  6.  
  7. die();

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

この意見に回答する

ツリーへ TOPへ

A03-1
replyeryuu_a0 [4月20日 22:57] (最終編集:4月20日 22:59)

  1. preg_match('/<span\\s+[^>]*style=(\'|")(.*)\\1/iU', $buffer, $match);

# より正確なものを望む場合は、http://www.w3.org/TR/REC-xml/ 参照。質問者もここまで望んでないと思われ、取れればいい程度にまとめてあります。

この意見に回答する

ツリーへ TOPへ

A04
answerermagicflute2 [4月20日 21:42]

この意見は投稿者によって削除されました。

ツリーへ TOPへ

A05
answereryuu_a0 [4月21日 02:15] (最終編集:4月21日 03:40)

あ~ http://www.phppro.jp/qa/2684 の続きね。

動的にするなら XSL かな。
[source.xhtml]
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" dir="ltr">
  3. <head>
  4.   <title>Test</title>
  5.   <link rel="stylesheet" type="text/css" href="main.css" />
  6. </head>
  7. <body>
  8.   <div>
  9.     <span class="xxx">表示テキスト</span>
  10.   </div>
  11. </body>
  12. </html>

[xhtml2html.xsl]
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <xsl:stylesheet
  3.  version="1.0" 
  4.  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  5.  xmlns:xhtml="http://www.w3.org/1999/xhtml"
  6.  exclude-result-prefixes="xsl xhtml"
  7. >
  8. <xsl:output
  9.  method="html"
  10.  doctype-public="-//W3C//DTD Compact HTML 1.0 Draft//EN"
  11.  encoding="Shift_JIS"
  12. />
  13.  
  14. <!-- 妥協案として contains の代わりに PHP 関数を使ってもいいかも知れない -->
  15. <xsl:template match="xhtml:span[contains(@class,'xxx')]" as="element()">
  16.   <xsl:element name="font">
  17.     <xsl:attribute name="size">-1</xsl:attribute>
  18.     <xsl:attribute name="color">#FF0000</xsl:attribute>
  19.     <xsl:apply-templates select="child::node()"/>
  20.   </xsl:element>
  21. </xsl:template>
  22.  
  23. <xsl:template match="@xml:lang">
  24.   <xsl:attribute name="lang">
  25.     <xsl:value-of select="."/>
  26.   </xsl:attribute>
  27. </xsl:template>
  28.  
  29. <xsl:template match="xhtml:*">
  30.   <xsl:element name="{local-name()}">
  31.     <xsl:apply-templates select="@*|node()"/>
  32.   </xsl:element>
  33. </xsl:template>
  34.  
  35. <xsl:template match="@*|node()">
  36.   <xsl:copy>
  37.     <xsl:apply-templates select="@*|node()"/>
  38.   </xsl:copy>
  39. </xsl:template>
  40.   
  41. </xsl:stylesheet>

など。

# XSL 自体 XML なので、CSS に対応するように生成することもできる。Selecter から XPath への変換が必要になってくるけど、それほど苦じゃいないじゃない。やっぱ、DOM CSS ほしい。PEAR にらしきものがあったような気がするけど。

# スタイルをインラインに突っ込まれると動的に変更するのはつらいね。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
負荷時のmysql_connect()エラー
 このエントリーをはてなブックマークに追加 
A
これはPHPというよりOSまたはMySQLのコミュニティで質問されたほうがいいと思います。 ぱっと思いついた範囲で記すと MySQL等のDBに「ある時点において同時に接続可能なクライアントの最大数」に制限があるよう...

>>続きを読む

今回のような実践的な経験がエンジニアのキャリアに繋がると思います。是非サービスを成功させて下さい!

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)