用PHP替换字符preg_replace

时间:2016-02-24 06:52:57

标签: php regex preg-replace

我使用以下代码格式化文本字符串并将其放在<div></div>标记内。

<?php

$errors  = '::This is line 1 ';
$errors .= '::This is line 2 ';

$errors = preg_replace('#::(.+?)\s*(?=::|$)#','<li>$1</li>',$errors);

echo ($errors);

?>

Fiddle

这样做会取$errors字符串,并将其转换为<li>This is line 1</li><li>This is line 2</li>,删除每个字符串前的::,并修剪尾随空格。

我尝试将>>添加到每个结果的开头,因此它会<li>>>This is line 1</li><li>>>This is line 2</li>

我想到的一种方法是在>>

的第二部分添加preg_replace

$errors = preg_replace('#::(.+?)\s*(?=::|$)#','<li>>>$1</li>',$errors);

哪个有效,但有没有办法在正则表达式本身的第一部分进行呢?

'#::(.+?)\s*(?=::|$)#'

我确实尝试过很多方法来调整regex,但最终得到了各种奇怪的结果。

2 个答案:

答案 0 :(得分:0)

怎么样!

<?php

$errors  = '::This is line 1 ';
$errors .= '::This is line 2 ';
$errors = str_replace("::","::>>" ,$errors);
$errors = preg_replace('#::(.+?)\s*(?=::|$)#','<li>$1</li>',$errors);

echo ($errors);

?>

答案 1 :(得分:0)

首先,您的解决方案没有任何问题(直接在函数中替换它)。另一种方法是使用preg_replace_callback(),您可以在其中提供其他功能 这是一个例子(为此目的 - 有点矫枉过正,但你明白了):

<?php
$errors  = '::This is line 1 ';
$errors .= '::This is line 2 ';

$regex = '#::(.+?)\s*(?=::|$)#';

$errors = preg_replace_callback($regex,
    // obviously, much more could be done here
    function($match) {
        $prefix = ">>";
        return "<li>{$prefix}{$match[1]}</li>";
    },
    $errors);

echo ($errors);
// output: <li>>>This is line 1</li><li>>>This is line 2</li>
?>