2010-08-19 54 views
0

我有一些代碼的字符串替換(例如:«USER_ID#USERNAME#STATUS»)更換就像這個例子:正則表達式查找特定的標記,在一個字符串

您好«USER_ID#USERNAME#STATUS »,你喜歡«PROD_ID#PRODNAME#STATUS»嗎?

我需要找到一種方法來獲取所有代碼以備將來替換。

我可以很容易地找到一個代碼這個表達式:

/«(.*)#(.*)#(.*)»/ 

,但無法找到一種方式來獲得所有preg_match_all代碼。

有人可以幫助我嗎?我使用PHP。

感謝

回答

0

嘗試

preg_match_all('/«(?<id>.*?)#(?<username>.*?)#(?<status>.*?)»/',$string,$matches); 
echo $matches[0]['username']; 

//And dont forget you have to loop. 
foreach($matches as $match) 
{ 
    echo $match['username']; 
} 

:)

array(7) { 
    [0]=> 
    array(2) { 
    [0]=> 
    string(27) "«USER_ID#USERNAME#STATUS»" 
    [1]=> 
    string(27) "«PROD_ID#PRODNAME#STATUS»" 
    } 
    ["id"]=> 
    array(2) { 
    [0]=> 
    string(7) "USER_ID" 
    [1]=> 
    string(7) "PROD_ID" 
    } 
    [1]=> 
    array(2) { 
    [0]=> 
    string(7) "USER_ID" 
    [1]=> 
    string(7) "PROD_ID" 
    } 
    ["username"]=> 
    array(2) { 
    [0]=> 
    string(8) "USERNAME" 
    [1]=> 
    string(8) "PRODNAME" 
    } 
    [2]=> 
    array(2) { 
    [0]=> 
    string(8) "USERNAME" 
    [1]=> 
    string(8) "PRODNAME" 
    } 
    ["status"]=> 
    array(2) { 
    [0]=> 
    string(6) "STATUS" 
    [1]=> 
    string(6) "STATUS" 
    } 
    [3]=> 
    array(2) { 
    [0]=> 
    string(6) "STATUS" 
    [1]=> 
    string(6) "STATUS" 
    } 
} 
3

你必須讓你的模式是非貪婪:

/«(.*?)#(.*?)#(.*?)»/ 

this

2
$string = "Hello «USER_ID#USERNAME#STATUS», do you like «PROD_ID#PRODNAME#STATUS»?"; 

preg_match_all('/«(.*)#(.*)#(.*)»/U',$string,$matches); 

echo '<pre>'; 
var_dump($matches); 
echo '</pre>'; 

array(4) { 
    [0]=> 
    array(2) { 
    [0]=> 
    string(25) "«USER_ID#USERNAME#STATUS»" 
    [1]=> 
    string(25) "«PROD_ID#PRODNAME#STATUS»" 
    } 
    [1]=> 
    array(2) { 
    [0]=> 
    string(7) "USER_ID" 
    [1]=> 
    string(7) "PROD_ID" 
    } 
    [2]=> 
    array(2) { 
    [0]=> 
    string(8) "USERNAME" 
    [1]=> 
    string(8) "PRODNAME" 
    } 
    [3]=> 
    array(2) { 
    [0]=> 
    string(6) "STATUS" 
    [1]=> 
    string(6) "STATUS" 
    } 
} 

注意使用Ungreedy開關。

我敢肯定有人會沿很快修改正則表達式,以便它的固有ungreedy

+0

對不起,壞,IO複製的樣本,以節省代碼的編寫,並擊中downvote,給你一個給予好評的不便並且你的代碼是可以的 – RobertPitt 2010-08-19 15:08:15

+0

@Robert - 你最好使用Artefacto的例子,它使得模式不被理解,而不是非理性的開關;但無論如何感謝 – 2010-08-19 15:11:43

+0

我的例子是下面,我不使用貪婪匹配,'(?。*?)' – RobertPitt 2010-08-19 15:18:33

相關問題