查找和替换HTML标记

时间:2016-08-03 10:04:33

标签: php regex

我正在尝试找到一个字符串并将其替换为另一个字符串,但是当字符串中包含换行符/空格时我遇到问题

我想找到以下内容:

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

并将其替换为以下内容:

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

这是我的RegEx,它显然没有像我期望的那样工作

<\s*tbody[^>]*>(.*?)<\s*/\s*tbody>

1 个答案:

答案 0 :(得分: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

上查看它