簡體   English   中英

preg_replace_callback如何增加和替換?

[英]how does preg_replace_callback increment and replace?

我一直在嘗試了解preg_replace_callback的工作原理,但是我不明白。

舉例來說,我從navigation.php獲得了get_contents。 其中有一堆href和divs,我想給每個ID添加增量ID,並在每個href之前添加一些代碼注釋。 我將如何遍歷所有這些內容,以便它們全部增加並添加ID和評論?

<?php
$string = file_get_contents("navigation.php");
$i = 1;
$replace = "<a ";
$with = '<!-- UNIT'.$i.' --><a id=a_'.$i;
$replace2 = "<div ";
$with2 = '<div id=b_'.$i;
preg_replace_callback()
$i++

?>

我想也許如果我能用我的代碼得到一個例子,也許我就能更好地理解它

所以$ replace和$ replace2是我要搜索的字符串,$ with和$ with2分別是替換項,而$ i是增量

因此作為數據輸入的示例

<a href="page4.php">Page 4</a>
<a href="page3.php">Page 3</a>
<div class="red">stuff</div>
<div class="blue">stuff</div>

我想要一個輸出像..

<!-- UNIT 1 --><a id="a_1" href="page4.php">Page 4</a>
<!-- UNIT 2 --><a id="a_2" href="page3.php">Page 3</a>
<div id="b_1" class="red">stuff</div>
<div id="b_2" class="blue">stuff</div>

您有多個目標,要實現imo的最簡單方法就是逐步進行。

1.正則表達式

您需要兩個HTML標記,可以通過/(<a|<div)/i輕松捕獲它們(原因說明g修飾符僅用於證明其正確匹配)。

這樣,您可以編寫以下代碼:

$parsed = preg_replace_callback('/(<a|<div)/i', ???, $string);

2.回調

可以將其背后的邏輯簡化為以下開關

switch ($found) {
    case '<div':
        $result = '<div id="b_'.$id.'"';
        break;
    case '<a':
        $result = '<!-- UNIT'.$id.' --><a id="a_'.$id.'"';
        break;
    default:
        $result = "";
        break;
}

要實現此目的,您可以編寫一個新函數或使用一個匿名函數。 為了使$id可以訪問,您需要了解PHP中的變量作用域 一種簡單的方法,可以避免使用諸如global $id; define()正在使用具有use()語法的Closures 為了能夠操作$id (增加它),您需要通過引用傳遞它 (使用Closures時)。 這將帶您到以下代碼:

$parsed = preg_replace_callback("/(<a|<div)/", function($match) use (&$id) {
    switch ($match[1]) {
        case '<div':
            $result = '<div id="b_'.$id.'"';
            break;
        case '<a':
            $result = '<!-- UNIT'.$id.' --><a id="a_'.$id.'"';
            break;
        default:
            $result = $match[1];//do nothing
            break;
    }
    $id++;

    return $result;
}, $string);

在這里觀看它的工作。

暫無
暫無

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

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