2010-10-31 85 views
2

我確定有人問過這個問題,但在google上搜索了1個多小時後,我決定在這裏問我的問題。Preg match question

我想遍歷數組感興趣的不同字符串/文本。 這些文本包含與兩個## valuetoreplace ##和#valuetoreplace#

我想對preg_matches字符串:

$pattern = '/^#{1}+(\w+)+#{1}$/'; 
if(preg_match($pattern, $value, $matches, PREG_OFFSET_CAPTURE)) 
{ 
    // do something with the #values# 
} 

$pattern = '/^#{2}+(\w+)+#{2}$/'; 
if(preg_match($pattern, $value, $matches, PREG_OFFSET_CAPTURE)) 
{ 
    //do something with the ##value## 
} 

這個偉大的工程。 現在我唯一的問題是:

時,我有一個字符串像

$valueToMatch = 'proceding text #value#'; 

我的preg_match不能找到我的價值了(因爲我使用了^和$)。

問題:如何找到#value###value##,而不必擔心這些單詞是否在(多行)值的中間?

*另外: 我想要的是找到模式並用數值替換#值#和一個##value##。 例如:

$thingsToReplace = 'Hello #firstname# #lastname#, 
How nice you joined ##namewebsite##.'; 

應該

'Hello John Doe, 
How nice you joined example.com.' 
+0

如果這些單詞處於(多行)值*的中間,那麼您無需擔心什麼意思?你是否希望跨越多少線? – 2010-10-31 13:57:11

回答

1

試試這個:/##([^#]+)##//#([^#]+)#/,按照這個順序。

+0

我已經試過這個。唯一的問題是。在這種情況下,## value ##也是正確的,因爲#value#是[#]#value#[#]的一部分 – Arthur 2010-10-31 14:01:13

+2

在這種情況下,運行正則表達式來替換'## valuetoreplace ##'* first *所以那些將全部消失,然後*運行正則表達式來替換'#valetoreplace#'。如果按順序執行,則不會出現上述問題,因爲## valueetoreplace ##'的所有實例都將消失。 – Asaph 2010-10-31 14:05:21

+0

這是一個好主意。謝謝阿薩夫 – Arthur 2010-10-31 14:09:57

0

也許很高興知道其他遊客我是怎麼做的:

foreach($personalizeThis as $key => $value) 
{ 
    //Replace ##values## 
    $patternIniData = '/#{2}+(\w+)#{2}/'; 
    $return = 'website'; //testdata 
    $replacedIniData[$key] = preg_replace($patternIniData, $return, $value); 

    //Replace #values# 
    $pattern = '/#{1}+(\w+)#{1}/'; 
    $return = 'ASD'; //testdata 
    $replacedDbData[$key] = preg_replace($pattern, $return, $replacedIniData[$key]); 
} 

回報$ replacedDbData;