42

我有以下 HTML 语句

[otsection]Wallpapers[/otsection]
WALLPAPERS GO HERE

[otsection]Videos[/otsection]
VIDEOS GO HERE

我想要做的是用 html div 替换 [otsection] 标签。问题是我想从 1->2->3 等增加 div 的 id。

所以例如,上面的语句应该翻译成

<div class="otsection" id="1">Wallpapers</div>
WALLPAPERS GO HERE

<div class="otsection" id="2">Videos</div>
VIDEOS GO HERE

据我所知,最好的方法是通过 preg_replace_callback 在每次替换之间增加 id 变量。但经过 1 小时的工作后,我无法让它工作。

对此的任何帮助将不胜感激!

4

2 回答 2

54

使用以下内容:

$out = preg_replace_callback(
    "(\[otsection\](.*?)\[/otsection\])is",
    function($m) {
        static $id = 0;
        $id++;
        return "<div class=\"otsection\" id=\"ots".$id."\">".$m[1]."</div>";
    },
    $in);

特别要注意我使用了一个static变量。此变量在对函数的调用中保持不变,这意味着每次调用函数时都会递增,每次匹配都会发生这种情况。

另外,请注意,我ots在 ID 前面加上了前缀。元素 ID 不应以数字开头。


对于 5.3 之前的 PHP:

$out = preg_replace_callback(
    "(\[otsection\](.*?)\[/otsection\])is",
    create_function('$m','
        static $id = 0;
        $id++;
        return "<div class=\"otsection\" id=\"ots".$id."\">".$m[1]."</div>";
    '),
    $in);
于 2012-06-24T03:49:35.323 回答
37

注意:以下内容旨在作为一般性答案,并不试图解决 OP 的特定问题,因为它之前已经解决过

是什么preg_replace_callback()

此函数用于执行正则表达式搜索和替换。它类似于str_replace(),但不是纯字符串,而是搜索用户定义的正则表达式模式,然后将回调函数应用于匹配的项目。如果找到匹配项,该函数返回修改后的字符串,否则返回未修改的字符串。

我应该什么时候使用它?

preg_replace_callback()与 -非常相似preg_replace()- 唯一的区别是不是为第二个参数指定替换字符串,而是指定一个callback函数。

preg_replace()当您想要进行简单的正则表达式搜索和替换时使用。preg_replace_callback()当您想要做的不仅仅是替换时使用。请参阅下面的示例以了解其工作原理。

如何使用它?

下面是一个例子来说明函数的用法。在这里,我们尝试将日期字符串从YYYY-MM-DD格式转换为DD-MM-YYYY.

// our date string
$string  = '2014-02-22';

// search pattern
$pattern = '~(\d{4})-(\d{2})-(\d{2})~';

// the function call
$result = preg_replace_callback($pattern, 'callback', $string);

// the callback function
function callback ($matches) {
    print_r($matches);
    return $matches[3].'-'.$matches[2].'-'.$matches[1];
}

echo $result;

在这里,我们的正则表达式模式搜索格式的日期字符串,NNNN-NN-NN其中N可以是范围从0-的数字9\d是字符类的简写表示[0-9])。回调函数将被调用并传递给定字符串中匹配元素的数组。

最终结果将是:

22-02-2014

注意:以上示例仅用于说明目的。您不应该使用来解析日期。使用DateTime::createFromFormat()andDateTime::format()代替。这个问题有更多细节。

于 2014-02-07T15:02:45.037 回答