目前共有9篇帖子。
【代码分享】我未完成的Node节点类
1樓 巨大八爪鱼 2015-10-24 23:38
【Node.php】
<?php
class Node implements ArrayAccess {
    protected $attributes = array();
    protected $children = array(); // Accessed by $this[number]
    protected $nodeName = 'div';
   
    protected static function attributeNameWarning() {
        triger_error('The name of the attribute cannot be an empty string.', E_USER_WARNING);
    }
   
    protected static function nodeNameWarning() {
        triger_error('The name of the node cannot be an empty string.', E_USER_WARNING);
    }
    /*static public function render($string) {
    }*/
   
    function __construct($nodeName = 'div') {
        $this->setNodeName($nodeName);
    }
   
    /* ------  Functions for ArrayAccess ------ */
   
    public function offsetExists($offset) {
        if (is_numeric($offset)) {
            return isset($this->children[$offset]);
        } else {
            return $this->hasAttribute($offset);
        }
    }
   
    public function offsetGet($offset) {
        if (is_numeric($offset)) {
            return $this->children[$offset];
        } else {
            return $this->getAttribute($offset);
        }
    }
   
    public function offsetSet($offset, $value) {
        if (is_numeric($offset)) {
            $this->children[$offset] = $value;
        } else {
            return $this->setAttribute($offset, $value);
        }
    }
   
    public function offsetUnset($offset) {
        if (is_numeric($offset)) {
            unset($this->children[$offset]);
        } else {
            $this->removeAttribute($offset);
        }
    }
    /* ------ END OF Functions for ArrayAccess ------ */
   
    public function getAttribute($name) {
        $name = trim($name);
        if (isset($this->attributes[$name])) {
            return $this->attributes[$name];
        } else {
            return '';
        }
    }
   
    public function getLength() {
        return count($this->children);
    }
   
    public function getNodeName() {
        return $this->nodeName;
    }
   
    public function hasAttribute($name) {
        if (empty($name)) {
            self::attributeNameWarning();
            return;
        }
        return isset($this->attributes[$name]);
    }
   
    public function removeAttribute($name) {
        if (empty($name)) {
            self::attributeNameWarning();
            return;
        }
        unset($this->attributes[$name]);
    }
   
    public function render($indentation = NULL, $noEndingSlash = false) {
        $str = $beginning = '';
        if (!is_null($indentation) && $indentation > 0) {
            $beginning = str_repeat('  ', $indentation);
            $str .= $beginning;
        }
        $str .= '<' . $this->nodeName;
        foreach ($this->attributes as $name => $value) {
            $str .= " $name";
            if (!is_null($value)) {
                $str .= "=\"$value\"";
            }
        }
        $len = $this->getLength();
        if ($len > 0) {
            $str .= '>';
            if ($len == 1 && is_string($this->children[0])) {
                $str .= $this->children[0];
            } else {
                $str .= "\n";
                foreach ($this->children as $child) {
                    if ($child instanceof Node) {
                        if (is_null($indentation)) {
                            $newIndentation = null;
                        } else {
                            $newIndentation = $indentation + 1;
                        }
                        $child = $child->render($newIndentation, $noEndingSlash);
                    } else {
                        $child = "  {$beginning}{$child}\n";
                    }
                    $str .= $child;
                }
                $str .= $beginning;
            }
            $str .= '</' . $this->nodeName . '>';
        } else {
            if ($noEndingSlash) {
                $str .= '>';
            } else {
                $str .= ' />';
            }
        }
        $str .= "\n";
        return $str;
    }
   
    public function setAttribute($name, $value = NULL) {
        if (empty($name)) {
            self::attributeNameWarning();
            return;
        }
        $this->attributes[$name] = $value;
    }
   
    public function setNodeName($newNodeName) {
        if (empty($newNodeName)) {
            self::nodeNameWarning();
            return;
        }
        $this->nodeName = trim($newNodeName);
    }
}
2樓 巨大八爪鱼 2015-10-24 23:39
【HTMLNode.php】
<?php
class HTMLNode extends Node {
    public function getID() {
        return $this['id'];
    }
   
    public function removeID() {
        $this->removeAttribute('id');
    }
   
    public function render($indentation = 0, $noEndingSlash = true) {
        return parent::render($indentation, $noEndingSlash);
    }
   
    public function setID($newID) {
        if (is_null($newID)) {
            $this->removeID();
        } else {
            $this['id'] = $newID;
        }
    }
}
3樓 巨大八爪鱼 2015-10-24 23:39
【test.php】
<?php
require_once('classes/Node.php');
require_once('classes/HTMLNode.php');
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
</head>

<body>
<?php
$form = new HTMLNode('form');
$form[0] = 'Here is some text.';
$form->setID('Col');
$form['action'] = 'a.php';
$form[1] = new HTMLNode('h4');
$form[1][0] = 'I\'m too sad!';
$form[2] = new HTMLNode('p');
$form[2][0] = 'Are you really ';
$form[2][1] = new HTMLNode('span');
$form[2][1][0] = 'sad';
$form[2][1]['style'] = 'color:#FF0000;font-weight:bold';
$form[2][2] = '?';
echo $form->render();
?>
</body>
</html>
4樓 巨大八爪鱼 2015-10-24 23:40
输出:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
</head>

<body>
<form id="Col" action="a.php">
  Here is some text.
  <h4>I'm too sad!</h4>
  <p>
    Are you really
    <span style="color:#FF0000;font-weight:bold">sad</span>
    ?
  </p>
</form>
</body>
</html>
5樓 巨大八爪鱼 2015-10-24 23:43
【代码解释】
$form = new HTMLNode('form'); // 创建一个form节点
$form[0] = 'Here is some text.'; // form节点的的第0个子节点为文本节点,内容为Here is some text.
$form->setID('Col'); // 设置form节点的id
$form['action'] = 'a.php'; // 设置form节点的action属性
$form[1] = new HTMLNode('h4'); // form节点的的第1个子节点为一个h4节点
$form[1][0] = 'I\'m too sad!'; // 设置这个h4节点的内容(也就是创建一个文本节点)
$form[2] = new HTMLNode('p');
$form[2][0] = 'Are you really ';
$form[2][1] = new HTMLNode('span');
$form[2][1][0] = 'sad';
$form[2][1]['style'] = 'color:#FF0000;font-weight:bold';
$form[2][2] = '?';
echo $form->render(); // 输出form节点的全部内容,并进行自动缩进
6樓 巨大八爪鱼 2015-10-24 23:47
本代码最重要的函数就是Node类的render方法。
7樓 巨大八爪鱼 2015-10-24 23:49
echo $form[2][1]->render();
对这个span标签单独进行render:
<span style="color:#FF0000;font-weight:bold">sad</span>

8樓 巨大八爪鱼 2015-10-24 23:52
$span = $form[2][1];
$span[1] = new HTMLNode('a');
$a = $span[1];
$a[0] = '打开链接';
$a['target'] = '_blank';
$a['href'] = 'https://zh.arslanbar.net/post.php?t=23306';
$a['style'] = 'color:#00FF00';
$a->setID('hahaha');
echo $span->render();

上面的代码把那个span标签拿出来修改,加了一个a标签,然后再单独输出这个span标签。
输出内容:
<span style="color:#FF0000;font-weight:bold">
  sad
  <a target="_blank" href="https://zh.arslanbar.net/post.php?t=23306" style="color:#00FF00" id="hahaha">打开链接</a>
</span>
9樓 巨大八爪鱼 2015-10-24 23:54
回复:8楼
值得注意的是,由于$span是从$form中提取出来的,所以修改了$span也就修改了$form[2][1],因此执行echo $form->render();后输出的内容已经发生变化:
<form id="Col" action="a.php">
  Here is some text.
  <h4>I'm too sad!</h4>
  <p>
    Are you really
    <span style="color:#FF0000;font-weight:bold">
      sad
      <a target="_blank" href="https://zh.arslanbar.net/post.php?t=23306" style="color:#00FF00" id="hahaha">打开链接</a>
    </span>
    ?
  </p>
</form>

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
 
 
©2010-2024 Arslanbar [手機版] [桌面版]
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。