2015-02-06 35 views
1

這裏的一些東西儲存在一個數據庫表:PHP或正則表達式的唯一ID匹配的

<section id="earth"> 
    <h2>Earth</h2> 
    <div class="MainDiv"> 
    (article) 
    </div> 
</section> 

<section id="mars"> 
    <h2>Mars</h2> 
    <div class="MainDiv"> 
    (article) 
    </div> 
</section> 

所有我想要做的就是修改顯示器,從而每個部分都有一個唯一的數據目標和每個div有一個匹配ID。 (我給div的一類 - MainDiv - 從它們可能包含任何嵌套的div區分它們)

<section id="earth" data-target="a"> 
    <h2>Earth</h2> 
    <div class="MainDiv" id="a"> 

<section id="mars" data-target="b"> 
    <h2>Mars</h2> 
    <div class="MainDiv" id="b"> 

理想情況下,我想保持數據的目標和ID的簡單匹配 - 單一的,小寫信件將是完美的。有沒有一個PHP函數可以做到這一點?如果沒有,你知道一個正則表達式腳本可以工作嗎?

+1

你可以使用數字增加的ID,'a1','a2','a3'等只是增加一個計數器並連接它的前綴。 – Barmar 2015-02-06 01:32:20

+0

請勿使用正則表達式。嘗試'DOMDocument :: createAttribute'或'SimpleXML :: addAttribute'。 – AbraCadaver 2015-02-06 01:32:28

回答

1

不,儘可能不要在正則表達式上處理此任務。這是HTML解析器的用途。 PHP已經有一個類,它是DOMDocument

首先,只加載了類(這是內置的話),那麼您加載HTML標記,讓你需要的所有元素(在這種情況下,部分標籤)。當你得到了所有的部分標記,重複這些發現添加這些數據屬性要用於每個那些(包括div標籤),然後你把它放回去一起串一次。這裏有一些讓你開始。粗糙的例子:

$i = 1; // initialize counter 
// initialize DOMDocument 
$dom = new DOMDocument; 
@$dom->loadHTML($html); // load the markup 

$sections = $dom->getElementsByTagName('section'); // get all section tags 
if($sections->length > 0) { // if there are indeed section tags inside 
    // work on each section 
    foreach($sections as $section) { // for each section tag 

     $section->setAttribute('data-target', 'section' . $i); // set id for section tag 

     // get div inside each section 
     foreach($section->getElementsByTagName('div') as $div) { 
      if($div->getAttribute('class') == 'MainDiv') { // if this div has class maindiv 
       $div->setAttribute('id', 'div' . $i); // set id for div tag 
      } 
     } 

     $i++; // increment counter 
    } 
} 

// back to string again, get all contents inside body 
$html = ''; 
foreach($dom->getElementsByTagName('body')->item(0)->childNodes as $child) { 
    $html .= $dom->saveHTML($child); // convert to string and append to the container 
} 

// output 
echo $html; 

Sample Output

1

我會做的@Barmar建議。這樣做a0a1a2,...,這樣我們就可以有多達我們希望,並通過循環echo在PHP中的每個<section>。如果我們從a,b,c,...,z接下來會是什麼? aa?你將不得不編程。對於每個元素,我會使用一個簡單的for循環,併爲每個元素使用索引。例如這樣的:

class Planet 
{ 
    public $title; 
    public $name; 
    public $article; 
    function __construct($title, $name, $article) { 
     $this->name = $name; 
     $this->title = $title; 
     $this->article = $article; 
    } 
} 

$planets = array(
    new Planet("earth", "Earth", "Hello World!"), 
    new Planet("mars", "Mars", "Hello World Again!") 
); 

for($i = 0; $i < count($planets); $i++) { 
    $id = strtolower($planets[$i]->name); 
    $name = $planets[$i]->name; 
    $article = $planets[$i]->article; 
    echo <<<HERE 
<section id="$id" data-target="a$i"> 
    <h2>$name</h2> 
    <div class="MainDiv" id="a$i"> 
    $article 
    </div> 
</section> 

HERE; 
} 

會給輸出:

<section id="earth" data-target="a0"> 
    <h2>Earth</h2> 
    <div class="MainDiv" id="a0"> 
    Hello World! 
    </div> 
</section> 
<section id="mars" data-target="a1"> 
    <h2>Mars</h2> 
    <div class="MainDiv" id="a1"> 
    Hello World Again! 
    </div> 
</section>