簡體   English   中英

php正則表達式替換html內容

[英]php regex to replace the html content

我正在使用這個 html 代碼

<ul class="nav_1">
    <li>
        <a href="#">Home</a>
        <ul class="submenu_nav_1">
            <li>
                <a href="#">Home</a>
                <ul class="submenu_nav_1_1">
                    <li><a href="#">Home</a></li>
                    <li><a href="#">Menu Item 1</a></li>
                </ul>
            </li>
            <li><a href="#">Menu Item 1</a></li>
        </ul>
    </li>
    <li><a href="#">Menu Item 1</a></li>
    <li><a href="#">Menu Item 2</a></li>
</ul>

<ul class="nav_2">
    <li><a href="#">Home</a></li>
    <li><a href="#">Menu Item 1</a></li>
    <li><a href="#">Menu Item 2</a></li>
</ul>

我想使用 php regex 在<ul class="nav_1">內添加此 html 代碼<li>Text</li> <ul class="nav_1">所以結果需要是:

<ul class="nav_1">
    <li>Text</li>
</ul>

<ul class="nav_2">
    <li><a href="#">Home</a></li>
    <li><a href="#">Menu Item 1</a></li>
    <li><a href="#">Menu Item 2</a></li>
</ul>

但是當我嘗試這個 php 代碼時:

<?php
    $html  = preg_replace('/(.*?<ul[^>]*?class=[\"|\']nav_1[\"|\'][^>]*>).*(<\/ul>.*)/s','$1'.PHP_EOL.'<li>Text</li>'.PHP_EOL.'$2',$html);
    echo $html;
?>

但是這段代碼返回:

<ul class="nav_1">
     <li>Text</li>
</ul>

正如其他人所說,使用正則表達式解析和操作 HTML 可能是一個非常令人頭疼的問題。

另一種方法是使用本機DOM庫。 進行輕微的操作非常簡單:

$html = <<<HTML
<ul class="nav_1">
    <li>
        <a href="#">Home</a>
        <ul class="submenu_nav_1">
            <li>
                <a href="#">Home</a>
                <ul class="submenu_nav_1_1">
                    <li><a href="#">Home</a></li>
                    <li><a href="#">Menu Item 1</a></li>
                </ul>
            </li>
            <li><a href="#">Menu Item 1</a></li>
        </ul>
    </li>
    <li><a href="#">Menu Item 1</a></li>
    <li><a href="#">Menu Item 2</a></li>
</ul>

<ul class="nav_2">
    <li><a href="#">Home</a></li>
    <li><a href="#">Menu Item 1</a></li>
    <li><a href="#">Menu Item 2</a></li>
</ul>
HTML;

// Load original HTML
$dom = new DOMDocument();
$dom->loadHTML($html);

// Find any <ul> with the class "nav_1"
$pathSearch = new DOMXPath($dom);
$ul = $pathSearch->query('//ul[@class="nav_1"]')->item(0);

// Remove the <ul>'s content
while ($ul->hasChildNodes()) {
    $ul->removeChild($ul->firstChild);
}

// Add a new <li> child element with the content "Text"
$ul->appendChild($dom->createElement('li', 'Text'));

echo $dom->saveHTML();

您可能需要根據您的類結構調整 XPath 查詢。 此 StackOverflow 問答提供了一些其他選項。

到目前為止,完成您想要的最簡單的方法是使用 JQUERY。

$(".nav_1").html("<li>Text</li>");

這是一個 JSFiddle。

https://jsfiddle.net/k9s27rtr/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM