2012-01-25 70 views
2

我對使用preg_replace等很新,所以請耐心等待。搜索並替換數千行php

我有一個包含此行

<strong>[*<a title="*" name="*"></a>]</strong><br /> Lorem ipsum 

*在上面的代碼表示數字,如1,2,3

我想要實現的是幾百行

*. Lorem Ipsum 

Example, 1. Lorem ipsum, 2. Lorem ipsum 

實現它的最好方法是什麼?謝謝。

示例文本

<strong>[1<a title="1" name="1"></a>]</strong><br /> Lorem ipsum 12345<br /> <strong>[2<a title="2" name="2"></a>]</strong><br /> lorem ipsum asdasd<br /> <strong>[3<a title="3" name="3"></a>]</strong><br /> lorem ipsum asdsadasdasdasd<br /> 

它去的方式多達上百

+0

你需要替換爲當前的更換次數'strong'標籤? –

+0

是的,我不需要強 – cicakman

回答

3

如何:

$output = preg_replace('~^<strong>\[(\d+)<.*?<br\s*/>~', '$1. ', $input); 

解釋:

~    : regex delimiter 
^   : start of line 
    <strong> : <strong> as is 
    \[   : an open square bracket 
    (\d+)  : capture one or more digits 
    <.*?  : > followed by any number of any char 
    <br\s*/> : <br/> or <br /> 
~ 

並取代所有比賽第一捕獲組(即數字)後面跟着一個點和一個空格。根據意見

編輯:

$input = '<strong>[1<a title="1" name="1"></a>]</strong><br /> Lorem ipsum 12345<br /> <strong>[2<a title="2" name="2"></a>]</strong><br /> lorem ipsum asdasd<br /> <strong>[3<a title="3" name="3"></a>]</strong><br /> lorem ipsum asdsadasdasdasd<br />'; 
$output = preg_replace('~\s*<strong>\[(\d+)<.*?<br\s*/>(.*?)(?:<br />|$)~', "$1. $2\n", $input); 
echo $output,"\n"; 

輸出:

1. Lorem ipsum 12345 
2. lorem ipsum asdasd 
3. lorem ipsum asdsadasdasdasd 
+0

嗨,輸出是相同的$輸入值 – cicakman

+0

$輸出是相同的$輸入,沒有變化正在做,我做錯了什麼?你需要我有的文字? – cicakman

+0

@cicakman:你能告訴我們一些示例輸入行嗎?我測試了我的答案,它工作得很好。 – Toto

1

一種方法是使用preg_replace_callback()並創建一個函數來增加一個變量,並與該變量的當前值代替*(儘管我認爲你可能不得不爲此使用全局變量,這通常被認爲是不好的做法)。

除此之外,我認爲你必須迭代(即循環)。

1
$x=1; 
$result = preg_replace_callback (
'%<strong(.*?)strong><br.?/>.?(.*?)\r\n%sim' 
, create_function(
      '$matches,$x', 
      'return $x++.$matches[1];' 
), $input); 

像這樣的事情

+0

echo $結果產生相同的$輸入 – cicakman