preg_replace_callback with array pattern and replacement(具有数组模式和替换的PREG_REPLACE_CALLBACK)
本文介绍了具有数组模式和替换的PREG_REPLACE_CALLBACK的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个函数使用preg_replace()
,其中模式和替换是数组。我需要一个计数器来跟踪替换,所以我将函数转换为使用preg_replace_callback
和闭包,但是我似乎找不到一种方法来区分将匹配传递给回调匹配的模式。有没有办法使用preg_place_callback替换array=>数组?
理想情况下,这是我想要的工作方式,但显然不会这样,因为$Pattern和$Replace在调用中求值,而不是在每次替换之间求值
function replaceTags($text)
{
$i = 1;
$pattern = array(
'/[d](.*?)[/d]/',
'/[s](.*?)[/s]/',
);
$replace = array(
'<div id="'.($i++).'">$1</div>',
'<span id="'.($i++).'">$1</span>',
);
return preg_replace($pattern, $replace, $text);
}
推荐答案
如果我理解正确的话,您只需要在调用回调函数之间保持状态。执行此操作的理想方式是使用成员函数。状态存储在对象实例中。每次调用时,您都可以修改对象,从而更改您的状态。
我还向您的模式添加了额外的捕获,以便区分回调中的模式。
<?php
class TagReplacer {
private $counter = 0;
public function replacer($matches) {
// modify the state
$this->counter++;
// return the replacement text using the state
if ($matches[1] === "d")
$tag = 'div';
else
$tag = 'span';
return "<{$tag} id="{$this->counter}">{$matches[2]}</{$tag}>";
}
}
function replaceTags($text) {
$stateObject = new TagReplacer();
$patterns = array(
'/[(d)](.*?)[/d]/',
'/[(s)](.*?)[/s]/',
);
return preg_replace_callback(
$patterns,
array(&$stateObject, "replacer"),
$text);
}
echo replaceTags("zzz[d]123[/d]zzz[s]456[/s]zzz[d]78[/d]zzz[s]90[/s]zzz");
?>
输出为
zzz<div id="1">123</div>zzz<span id="3">456</span>zzz<div id="2">78</div>zzz<span id="4">90</span>zzz
我很惊讶ID没有按数字顺序排列。我的猜测是preg_place_callback迭代通过模式数组,一次为每个模式执行所有替换。
这篇关于具有数组模式和替换的PREG_REPLACE_CALLBACK的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:具有数组模式和替换的PREG_REPLACE_CALLBACK


猜你喜欢
- Oracle 即时客户端 DYLD_LIBRARY_PATH 错误 2022-01-01
- openssl_digest vs hash vs hash_hmac?盐与盐的区别HMAC? 2022-01-01
- 如何在 Symfony2 中正确使用 webSockets 2021-01-01
- 如何使用 Google API 在团队云端硬盘中创建文件夹? 2022-01-01
- PHP foreach() 与数组中的数组? 2022-01-01
- 如何从数据库中获取数据以在 laravel 中查看页面? 2022-01-01
- 覆盖 Magento 社区模块控制器的问题 2022-01-01
- 使用 GD 和 libjpeg 支持编译 PHP 2022-01-01
- Laravel 5:Model.php 中的 MassAssignmentException 2021-01-01
- PHP - if 语句中的倒序 2021-01-01