2014-11-05 72 views
0

我正在研究一段代碼,以幫助我根據從網站上獲取的值創建電子郵件正文。 但我有問題用值替換佔位符。PHP - 在循環數組的同時替換多組佔位符

我的 「替代佔位符」 代碼如下所示:

foreach ($products as $productID) 
{ 
    $product_array = scrape_product($scrape_url, $productID); 

    foreach ($product_array as $key => $value) 
    { 
     $pattern = '/\#' . $key . '\#/'; 
     $email_body = preg_replace($pattern, $value, $email_body, $product_count); 
    } 
} 

功能scrape_product($ scrape_url,$的productID);返回一個數字數組,看起來像這樣:

$product_array = array(
    "PRODUCTID" => $ID, 
    "TITLE"  => $productname, 
    "ONELINER" => $oneliner, 
    "PRICE"  => $price, 
    "PRICE_ORG" => $price_org, 
    "DISCOUNT" => $discount, 
    "IMAGE"  => $image, 
    "URL"  => $scrape_url, 
); 

該陣列由或鍵值對,併爲每個陣列我回去我依次通過我的電子郵件模板尋找格式#鍵#佔位符 - >的例如#PRODUCTID#。

然後我用這個:

$pattern = '/\#' . $key . '\#/'; 
$email_body = preg_replace($pattern, $value, $email_body, $product_count); 

與對應的佔位符替換佔位符。

所以,這裏是我的問題: 在我的電子郵件模板中,出現了幾次相同的佔位符(即#PRODUCTID#) - 確切地說,每個數組都有一組完整的佔位符。

但我不能讓代碼正確替換佔位符...像:

array1 -> placeholder set1 
array2 -> placeholder set2 
array3 -> placeholder set3 
and so on... 

我的系統允許最多,共12個產品= 12個陣列與產品信息需要被放入郵件模板。但現在它將數組1中的值替換爲佔位符,然後結束(因爲在第一個runthrough後沒有剩下佔位符)。

變量$ PRODUCT_COUNT持有產品陣列的數量(可從1-12的任何東西)

使用strtr函數的效率()和str_replace()函數沒有任何的運氣我已經試過了。

幫助,輸入或提示將不勝感激。

更新 - 加入我的模板的一個例子

<table width="285" cellspacing="0" cellpadding="0" border="1" style="text-align: left; margin-left: 5px; table-layout: fixed;"> 
<tbody> 
    <tr> 
     <td align="center" width="284" valign="middle" colspan="2"> 
      <a href="#URL##PRODUCTID#/?ssel=false&utm_campaign=%%jobid%%-%%xtyear%%%%xtmonthnumeric%%%%xtday%%&utm_source=newsletter&utm_medium=email&utm_content=#PRODUCTID#" target="_blank"> 
       <img src="#IMAGE#" style="width: 200px; height: 150px; border: 0pt none; margin: 0px;" width="200" height="150" alt="#TITLE#" /> 
      </a> 
     </td> 
    </tr> 

    <tr> 
    <td colspan="2" height="3" style="font-size:1px; line-height:1%;"> </td> 
    </tr> 
    <tr style="font-family: arial; font-size: 15px; color: #363636; font-weight: bold; margin-top: 0px; margin-bottom: 0px;"> 
     <td width="285" valign="top" colspan="2"> 
      #TITLE# 
     </td> 
    </tr> 
    <tr style="font-family: arial; font-size: 15px; font-weight: 100; color: #363636;"> 
     <td height="85" align="left" valign="top" style="height: 85px; font-size: 11px; margin-top: 0px; margin-bottom: 0px;"> 
      <table cellspacing="0" cellpadding="0" align="left" valign="top" style="font-family: arial; text-align-left; font-size: 11px; margin-top: 0px; margin-bottom: 0px;"> 
       <tr> 
        <td height="3" style="height:3px; font-size:1px; line-height:1%;"> </td> 
       </tr> 
       <tr> 
        <td valign="top" height="54" style="height: 54px;"> 
         #ONELINER# 
        </td> 
       </tr> 
      </table> 
    </tr> 
</tbody> 
</table> 
<table width="285" cellspacing="0" cellpadding="0" border="1" style="text-align: left; margin-left: 5px; table-layout: fixed;"> 
<tbody> 
    <tr> 
     <td align="center" width="284" valign="middle" colspan="2"> 
      <a href="#URL##PRODUCTID#/?ssel=false&utm_campaign=%%jobid%%-%%xtyear%%%%xtmonthnumeric%%%%xtday%%&utm_source=newsletter&utm_medium=email&utm_content=#PRODUCTID#" target="_blank"> 
       <img src="#IMAGE#" style="width: 200px; height: 150px; border: 0pt none; margin: 0px;" width="200" height="150" alt="#TITLE#" /> 
      </a> 
     </td> 
    </tr> 

    <tr> 
    <td colspan="2" height="3" style="font-size:1px; line-height:1%;"> </td> 
    </tr> 
    <tr style="font-family: arial; font-size: 15px; color: #363636; font-weight: bold; margin-top: 0px; margin-bottom: 0px;"> 
     <td width="285" valign="top" colspan="2"> 
      #TITLE# 
     </td> 
    </tr> 
    <tr style="font-family: arial; font-size: 15px; font-weight: 100; color: #363636;"> 
     <td height="85" align="left" valign="top" style="height: 85px; font-size: 11px; margin-top: 0px; margin-bottom: 0px;"> 
      <table cellspacing="0" cellpadding="0" align="left" valign="top" style="font-family: arial; text-align-left; font-size: 11px; margin-top: 0px; margin-bottom: 0px;"> 
       <tr> 
        <td height="3" style="height:3px; font-size:1px; line-height:1%;"> </td> 
       </tr> 
       <tr> 
        <td valign="top" height="54" style="height: 54px;"> 
         #ONELINER# 
        </td> 
       </tr> 
      </table> 
    </tr> 
</tbody> 

正如你(希望)可以在模板代碼中看到佔位符出現不止一次(例如#ONELINER#)。

我想在第一次遇到佔位符時用產品1的oneliner值替換#ONELINER#佔位符。第二次,它應該是產品2的價值等等......

希望這是有道理的。

UPDATE

下面是一個產品陣列需要更換成我的模板的一個例子。按照動態要求。

PRODUCTID -> 50107639XX 
TITLE -> Sony XPERIA Z1 Compact 
ONELINER -> Det bedste fra Sony i en kompakt, vandtæt smartphone 
PRICE -> 2500 
PRICE_ORG -> 5000 
DISCOUNT -> 50% 
IMAGE -> //media.jflindt.dk/image/49377/500/400/sony-xperia-z1-compact-16gb-sort.jpg 
URL -> http://www.jflindt.dk/product/ 
+0

添加模板樣本 – JFlindt 2014-11-05 13:43:11

回答

1

其實這樣簡單的替換你不需要preg。您可以使用str_replace();

$search = array(
    '#PRODUCTID#', 
    '#TYPE#', 
    '#CAT#' 
); 

$replace = array(
    'val1', 
    'val2', 
    'val3' 
); 

$text = str_replace($search, $replace, $text); 

作爲阿邁勒指出的那樣,如果你有對的數組:

$pairs = array(
    "#PRODUCTID#" => $ID, 
    "#TITLE#"  => $productname, 
    "#ONELINER#" => $oneliner 
); 

您可以使用strtr();

$text = strtr($text, $pairs); 

本書雖然是我個人比較喜歡str_replace由於其名稱。如果您需要構建$search$replace陣列,具有$pairs一個數組,你可以這樣做:

$search = array_keys($pairs); 
$replace = array_values($pairs); 
+1

'str_replace()函數'是你的朋友,平時。 – David 2014-11-05 13:19:05

+1

或['strtr()'](http://php.net/strtr)。 – 2014-11-05 13:20:52

+0

我已經嘗試過str_replace()和strtr(),並且它們不會解決問題......最近的問題是使用preg_replace。 – JFlindt 2014-11-05 13:35:48