[PHP-users 30277] Re: 正規表現でタグの属性値を取り出すには?

小川 洋 | Hiroshi Ogawa wiredhiro @ ybb.ne.jp
2006年 9月 7日 (木) 07:02:52 JST


ucb.rcdtokyoさん

小川です。ありがとうございます。
さっそく試してみます。


On 2006/09/07, at 0:05, ucb.rcdtokyo wrote:

> こんばんは。
>
> もし、単一の正規表現で一気に取り出したいという主旨であればズレ 
> ちゃってますが。
> 以下は、いったん開始タグの文字列を取り出した上で、そこからさら 
> に、指定の属性値を取り出すもので、この例では(すべての) 
> AタグのHREF属性値を取り出し、配列に格納しています。
>
> /*  
> ------------------------------------------------------------------ */
> $array = array();
> if (preg_match_all('/<a\b[^>]*?>/si', $html, $matches)) {
>   foreach ($matches[0] as $value) {
>     if (false !== $x = get_html_attrib('href', $value)) {
>       $array[] = $x;
>     }
>   }
> }
> print_r($array);
>
> function get_html_attrib($attrib, $tag)
> {
>   $regex = "/[\s'\"]$attrib\s*=\s*([^\s'\">]+|'[^']+'|\"[^\"]+\")/si";
>   return preg_match($regex, $tag, $matches)?
>     preg_replace('/^\s*[\'"](.+)[\'"]\s*$/s', '$1', $matches[1]):
>     false;
> }
> /*  
> ------------------------------------------------------------------ */
>
> 例として挙げておられるHTMLに対しては随分冗長ですが、より 
> 汎用的に使えるかな、と(ただし、タグの文字列を取り出している箇 
> 所は、タグの中途に「>」があるとコケます)。
> ちなみに http://www.rcdtokyo.com/pc2m/note/
> にあるスクリプトは基本的にこのパターンで属性値を取り出してお 
> り、様々なHTMLと格闘(笑)した結果こんな感じでやってます。
>
> また、余談ですが、正規表現が必須なわけではなく、HTMLの各 
> タグの属性を手軽に取り出したいということであれば、Tidyや 
> PEARのXML_HTMLSaxが使えるかもしれません。
> 以下はXML_HTMLSax3の例です。
>
> /*  
> ------------------------------------------------------------------ */
> require_once 'XML/HTMLSax3.php';
> $parser = new XML_HTMLSax3;
> $handler = new MyHandler;
> $parser->set_object($handler);
> $parser->set_element_handler('openHandler', 'closeHandler');
> $parser->parse($html);
> print_r($handler->tags);
>
> class MyHandler
> {
>   var $tags;
>   function MyHandler()
>   {
>     $this->tags = array();
>   }
>   function openHandler(&$parser, $name, $attribs)
>   {
>     if (!empty($attribs)) {
>       $this->tags[] = array($name => $attribs);
>     }
>   }
>   function closeHandler(&$parser, $name)
>   {
>   }
> }
> /*  
> ------------------------------------------------------------------ */
>
> 06/09/06 に 小川 洋 | Hiroshi  
> Ogawa<wiredhiro @ ybb.ne.jp> さんは書きました:
>> 小川です。こんばんは。
>>
>> 正規表現で<td>タグの要素と、hrefの属性値を取り出 
>> した
>> いと思い、下記のようなコードを書きました。
>> <td>タグの要素は取り出せるのですが、hrefの属性値「images/
>> 1100025001p2.jpg」が取り出せません。
>> どなたか、適切なアドバイスをよろしくお願いします。
>>
>> <?php
>> //初期化
>> $matches="";
>> //文字列全体
>> $html='<h1 class="line_h1_ico_land">佐倉 市 井野</
>> h1><td><a href="images/1100025001p2.jpg" target="_blank"><img
>> src="images/1100025001p1.jpg" border="0"></a></td>あいう<td
>> colspan="2">えおか</td><td>きくけ</td><td>こさし</
>> td><td>すせそbnnjhgghあああああぴ ここ き</ 
>> td><td>12345</
>> td>';
>>
>> preg_match_all("!(<a\s.*?\bhref\s*=\s*
>> ((\"([^\"]+)\")|[^\'\"\s]+)|
>> \'([^\']+)\'[^>]*>)|(<h1\s?(\".*?
>> \"|\'.*?\'|[^'\"])*?>(.*?)</h1>)|(<td\s?
>> (\".*?\"|\'.*?\'|[^'\"])*?>(.*?)</td>)!",
>> $html,$matches);
>>
>> for($i=0; $i<count($matches[0]); $i++)
>> {
>>         echo "要素:".strip_tags($matches[0][$i])."<br>";
>>         //echo "要素:".$matches[0][$i]."<br>";
>> }
>> ?>
>
> -- 
> (It's always) Under Construction, Baby
> http://www.rcdtokyo.com/ucb/
> _______________________________________________
> PHP-users mailing list  PHP-users @ php.gr.jp
> http://ns1.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みく 
> ださい
> http://www.php.gr.jp/php/novice.php3



PHP-users メーリングリストの案内