PHP - 如何使用html标记解析xml中的链接?

时间:2012-09-18 10:00:22

标签: php html xml xml-parsing

我的xml有一个带有href链接的问题,我不能以正确的顺序回显。

XML:

<root>
      <x>290</x>
      <y>204</y>
      <width>420</width>
      <height>70</height>
        <htmlText>
                 <TEXTFORMAT LEADING="7">
                 <P ALIGN="CENTER">
                 <FONT FACE="Arial" SIZE="12" COLOR="#333333" LETTERSPACING="0" KERNING="0">
                 SOME TEXT 
                 <A HREF="mailto:some@email.com" TARGET="">
                 <U>some@email.com</U>
                 </A> SOME TEXT
                 </FONT>
                 </P>
                 </TEXTFORMAT>
                 </htmlText>
    </root>

我的moduletext功能:

<?php 
class modules
{
     private $xml;
     protected $build;
     // div text
     public $div_x, $div_y, $div_width, $div_height, $title, $post, $date, $caption_fontfamily, $caption, $caption_fontsize, $caption_color, $caption_ls, $serverEmail, $name, $email, $message, $src;

     private $direction, $fontFamily, $af_color, $color, $bold, $italic, $underline, $af_bold, $af_italic, $af_underline, $size;
     // P
     public $p_attr_color, $p_attr_align, $p_attr_fontfamily, $p_attr_fontsize, $p_content, $p_content_temp;
     // Image module
     private $img_path, $img_x, $img_y, $img_rotation, $img_width, $img_height;
     // Shape module
     private $shape_x, $shape_y, $shape_width, $shape_height, $fill_color, $border_color, $border_size, $shape_type, $alpha, $rotation, $prettyPrinting, $opacity;
    public function moduleText($xml,$print = '')
     {
         $this->xml = new SimpleXMLElement($xml);
         // Plocka ut XML-data
         $this->div_x = $this->xml->x;
         $this->div_y = $this->xml->y;
         $this->div_width = $this->xml->width;
         $this->div_height = $this->xml->height;
         $this->divStart = $this->xml->htmlText[0]->TEXTFORMAT->attributes->LEADING;
         $this->build = '<div id="printthis" style="position:absolute; overflow:auto;left:'.$this->div_x.'px;top:'.$this->div_y.'px;width:'.$this->div_width.'px;height:'.$this->div_height.'px;">';

     foreach($this->xml->htmlText as $htmltext)
         {
             foreach($htmltext as $textformat)
             {
             $line_height = $textformat->attributes()->LEADING;
                 foreach($textformat as $p)
                 {

                     foreach($p as $font)
                     {

                        if(isset($font->A))
                         {      


                         foreach($font->A as $link) {
                             $size = $link->attributes()->SIZE;
                             $target .= $link->attributes()->TARGET;

                             $this->build .= '<div style="width:100%; float:left; margin-left:5px; font-size:'.$size.'px;"><a href="' . str_replace("http://","",$link->attributes()->HREF) . '" target="'.$target.'" style="font-size:'.$size.'px;">'.str_replace(array("http://","mailto:"),"",$link->attributes()->HREF).'</a></div>';
                             } 
                         }
                         $fontsize = $font->attributes()->SIZE;
                         $fontfamily = str_ireplace(array('_'), array(''), $font->attributes()->FACE);
                         $fontcolor = $font->attributes()->COLOR;
                         $test = "1.305";
                         if(strlen($font) > 0) {
                         $this->build .= '<div align="'.$this->p_attr_align.'" style="width:100%; color:'.$fontcolor.';font-family:'.$fontfamily.';font-size:'.$fontsize.'px; line-height:'.$test.'em;">';
                         if(isset($font->A)) {
                         $this->build .= iconv('UTF-8','ISO-8859-1', str_ireplace(array('[b]','[/b]','[i]','[/i]'), array('<b>','</b>','<i>','</i>'), $font . '</div>')); 
                         } else {
                         $this->build .= iconv('UTF-8','ISO-8859-1', str_ireplace(array('[b]','[/b]','[i]','[/i]'), array('<b>','</b>','<i>','</i>'), $font . '</div>')); 
                         }
                         }
                         if(strlen($font->I) > 0) {
                         $this->build .= '<div align="'.$this->p_attr_align.'" style="width:100%;  color:'.$fontcolor.';font-family:'.$fontfamily.';font-size:'.$fontsize.'px; line-height:'.$test.'em;">';
                         $this->build .= iconv('UTF-8','ISO-8859-1', str_ireplace(array('[b]','[/b]','[i]','[/i]'), array('<b>','</b>','<i>','</i>'), "<i>".$font->I . '</i></div>'));
                     }

                     if(strlen($font->U) > 0) {
                         $this->build .= '<div align="'.$this->p_attr_align.'" style="width:100%; text-decoration:underline;  color:'.$fontcolor.';font-family:'.$fontfamily.';font-size:'.$fontsize.'px; line-height:'.$test.'em;">';

                         $this->build .= iconv('UTF-8','ISO-8859-1', str_ireplace(array('[b]','[/b]','[i]','[/i]'), array('<b>','</b>','<i>','</i>'), "<i>".$font->U . '</i>'));
                         $this->build .= '</div>';
                     }
                     if(strlen($font) == 0 && strlen($font->U) == 0 && strlen($font->I) == 0) {
                     $this->build .= '<div align="'.$this->p_attr_align.'" style="width:100%; text-decoration:underline;  color:'.$fontcolor.';font-family:'.$fontfamily.';font-size:'.$fontsize.'px; min-height:'.$test.'em; line-height:'.$test.'em;"></div>';
                     }

                     } 
                 }
              }
         }
         $this->build .= '</div>';
                return $this->build;
     }
            }
            ?>

PHP用xml调用方法:

<?php include("functions_modules.php"); 
$module = new modules; $xmlcode = '<root>
<x>290</x>
<y>204</y>
<width>420</width>
<height>70</height>
<htmlText>
<TEXTFORMAT LEADING="7">
<P ALIGN="CENTER">
<FONT FACE="Arial" SIZE="12" COLOR="#333333" LETTERSPACING="0" KERNING="0">
SOME TEXT
<A HREF="mailto:some@email.com" TARGET="">
<U>some@email.com</U>
</A>
SOME TEXT
</FONT></P>
</TEXTFORMAT>
</htmlText>
</root>'; 
echo $module->moduleText($xmlcode); ?>

结果变为:

SOME TEXT
SOME TEXT
<a href="mailto:some@email.com">some@email.com</a>

它应该是:

  

一些文字       some@email.com       一些文字

2 个答案:

答案 0 :(得分:0)

我希望这会有所帮助。我喜欢使用xpath来切换我从SimpleXML中获取的XML:

<?php
$xml = new SimpleXMLElement("xml_file_path", NULL, True);
$tags = $xml->xpath('//a');  //use xpath on the XML to find the a tags

foreach($tags as $tag){  
    echo $image['href'] ;  //here is the a tag src
}
?>

试试此链接

http://php.net/manual/en/book.simplexml.php

Reading an XML file and store data to mysql database

答案 1 :(得分:0)

通过制作链接bbcode解决它,然后再将它们preg_matched到链接。