2016-08-03 17 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

上で実行を参照してください。正規表現だけでなく –

+2

これには正規表現を使用しない – trincot

+0

sフラグを使用しない限り、正規表現の。*は改行と一致しません。 [\ s \ S] *(空白または非空白=何でも)で置き換えることもできます。しかし、ええ、[一般的な理解がある](http://stackoverflow.com/questions/3577641/how-do-you-parse-and-process-html-xml-in-php)regexが最後のオプションであるべきだXML/HTMLの解析。 – LukStorms

答えて

2

単純なケースでは機能しますが、一般的には、HTMLの解析と修正にはnot use regular expressionsが必要です。代わりに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); 

あなたは、関連するすべてのPHPを表示してください可能性があり、それはまたideone.com