2016-03-08 73 views
1

何时应该在HTML链接中使用&符号实体(&)?何时应该在HTML链接中使用&符号实体(&)?

上下文:我问的原因是我使用DOMDocument()<img>标签转换为不同的HTML,并且该&符号被重复。对于我的具体示例,我认为这是由于mb_convert_encoding(),但如果我不使用它,我还有其他问题。也许有其他时候不应该在HTML链接中使用&符号实体?

public static function substituteImg($template, $values, $classI='autoInsert', $classF='',$escape=false) { 
    $classesToReplace = array($classI); 
    if($template) { 
     $doc = new DOMDocument(); 
     $template = mb_convert_encoding($template, 'HTML-ENTITIES', 'UTF-8'); 
     $doc->loadHTML($template); 

     $xpath = new DOMXPath($doc); 
     foreach($xpath->query('//img') as $img) { 
      // get the classes into an array 
      $classes = explode(' ', $img->getAttribute('class')); // this will contain the classes assigned to the element 
      if (array_intersect($classes, $classesToReplace)) 
      { 

       // preprocess the image name to match the $values keys 
       $imageName = pathinfo($img->getAttribute("src"),PATHINFO_FILENAME); 
       if (isset($values[$imageName])) { 
        if(is_array($values[$imageName])){ 
         //Not a text node 
         switch($values[$imageName]['type']) 
         { 
          case 'a': 
           $element = $doc->createElement('a',htmlentities($values[$imageName]['value'])); 
           $element_href = $doc->createAttribute('href'); 
           $element_href->value=htmlentities($values[$imageName]['attr']); 
           $element->appendChild($element_href); 
           if($classF) { 
            $element_class = $doc->createAttribute('class'); 
            $element_class->value=$classF; 
            $element->appendChild($element_class); 
           } 
           break; 
          default:{trigger_error("Invalid element type", E_USER_ERROR);} 
         } 
        } 
        else {$element = $doc->createTextNode($escape?htmlentities($values[$imageName]):$values[$imageName]);} 
        $img->parentNode->replaceChild($element,$img); 
       } 
      } 
     } 
     $body = $doc->getElementsByTagName('body')->item(0); 
     $template=$doc->saveHTML($body); //Select the body tag 
     $template = str_replace(array('<body>', '</body>'), '', $template); //strip the body tags 
     unset($doc,$xpath); 
    } 
    return $template; 
} 

样品阵列传递给substituteImg()

Array 
(
    [bla] => 2721930660 
    [link1] => Array 
     (
      [type] => a 
      [value] => Yes 
      [attr] => javascript:void(0) 
     ) 
    [link2] => Array 
     (
      [type] => a 
      [value] => link 
      [attr] => https://example.com/index.php?foo=123&amp;bar=321 
     ) 
) 

回答

2

,每当你想表达HTML,数据&其中内容是当你使用它的元素中,除了你应该使用&amp;明确标记为CDATA(意思是<script><style>元素)。

您不应该使用使用&amp;当您使用DOM API来操作DOM中的文本时。 (这是你在这里做的)。

如果DOM是从HTML文档生成的,则在生成DOM时,&amp;将被解析为&

如果您从DOM生成HTML,则在将其转换为HTML时,&将表示为&amp;


对于我的具体的例子,我认为这是发生由于mb_convert_encoding(),

不,这是由于$doc->saveHTML($body);将DOM转换成HTML。

+0

谢谢。非常好的答案。因此,两次不应该使用'&amp ;'在CDATA内部以及使用DOM API时。你能想到其他任何时候吗? – user1032531

+0

基本上任何时候你正在处理一些不期望你编写原始HTML源代码的东西。 – Quentin

相关问题