[英]How to replace below preg_replace with 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.