我一直试图了解preg_replace_callback是如何工作的,但我只是不明白。
比方说,我是来自navigation.php的get_contents。 其中有一堆href和div,我希望在每个href之前给出增量id并添加一些代码注释。 我将如何遍历所有这些以便它们都会增加并添加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>
答案 0 :(得分:0)
你有多个目标,实现它们的最简单方法是逐步完成它。
<强> 1。 RegEx
您需要两个HTML标记,这些标记可以通过/(<a|<div)/i
轻松捕获(explanation,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
可访问,您需要了解variable scope in PHP。使用global $id;
或define()
之类的任何内容的简单方法是使用Closures语法use()
。为了能够操纵$id
(递增它),您需要pass it by reference(使用闭包时)。这将带您进入以下代码:
$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);
注意它的工作here。