2016-02-24 187 views
0

我使用以下代碼格式化文本字符串並將它們放入<div></div>標記中。用PHP替換字符preg_replace

<?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,但古靈精怪的結果告終。

回答

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); 

?> 
+0

這是一個額外的步驟。不能這樣做。需要在'preg_replace'本身執行。 – Norman

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> 
?>