2016-08-03 80 views
-3

我试图找到一个字符串,并用另一个替换它,但我面临的问题时,串有换行/空格它查找和替换HTML标记

我试图找到如下:

<tbody> 
    <tr> 
     <td> 
      {{ username }} 
     </td> 
    </tr> 
    </tbody> 

,并替换为以下:

<thead> 
    <tr> 
     <td> 
      {{ salutation }} 
     </td> 
    </tr> 
    </thead> 
    <tbody> 
    <tr> 
     <td> 
      {{ username}} 
     </td> 
    </tr> 
    </tbody> 

这是我的正则表达式,这显然是不工作我期望它的工作

方式
<\s*tbody[^>]*>(.*?)<\s*/\s*tbody> 
+0

,也需要运行,你可以请出示所有相关的PHP;不只是正则表达式 –

+2

不要使用正则表达式 – trincot

+0

正则表达式中的。*不匹配换行符,除非使用s标志。也可以用[\ s \ S] *(空白或非空白=任何东西)替换它。但是,[有一个普遍的理解](http://stackoverflow.com/questions/3577641/how-do-you-parse-and-process-html-xml-in-php)正则表达式应该是最后一个选项解析XML/HTML。 – LukStorms

回答

2

虽然它可以在简单的情况下工作,但您应该在一般的not use regular expressions解析和修改HTML。而是使用可通过DOMDocument向PHP提供的DOM接口。

您可以使用此功能:

function addSalutation($html) { 
    $doc = new DOMDocument(); 
    $doc->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 
    $xpath = new DOMXPath($doc); 
    $tds = $xpath->query('//tbody/tr/td[contains(text(),"{{ username }}")]'); 
    foreach(iterator_to_array($tds) as $td) { 
     $newTd = $doc->createElement('td', '{{ salutation }}'); 
     $newTr = $doc->createElement('tr'); 
     $newHd = $doc->createElement('thead'); 

     $newTr->appendChild($newTd); 
     $newHd->appendChild($newTr); 
     $tbody = $td->parentNode->parentNode; 
     $tbody->parentNode->insertBefore($newHd, $tbody); 
    } 
    return $doc->saveHTML(); 
} 

调用示例:

// Sample data 
$html = ' 
<tbody> 
    <tr> 
     <td> 
      {{ username }} 
     </td> 
    </tr> 
</tbody>'; 

// Add salutation 
$html = addSalutation($html); 

// Output result 
echo htmlentities($html); 

看到它在ideone.com