Php 查找和替换HTML标记

Php 查找和替换HTML标记,php,regex,Php,Regex,我试图找到一个字符串并用另一个字符串替换它,但当字符串中有换行符/空格时,我面临问题 我试图找到以下内容: <tbody> <tr> <td> {{ username }} </td> </tr> </tbody> <thead> <tr> <td> {{ sa

我试图找到一个字符串并用另一个字符串替换它,但当字符串中有换行符/空格时,我面临问题

我试图找到以下内容:

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

{{username}}
并将其替换为以下内容:

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

{{称呼}}
{{username}}
这是我的正则表达式,显然没有按照我期望的方式工作

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

虽然它可以在简单的情况下工作,但您通常应该使用它来解析和修改HTML。而是使用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);
//示例数据
$html='1
{{username}}
';  
//加上问候语
$html=地址($html);
//输出结果
回音html属性($html);

看到它在

上运行了吗,请您显示所有相关的PHP;不仅仅是正则表达式不要为此使用正则表达式正则表达式正则表达式中的。*与换行符不匹配,除非使用s标志。也可以将其替换为[\s\s]*(空白或非空白=任何内容)。但是,正则表达式应该是解析XML/HTML的最后一个选项。