Я работаю над фрагментом кода, чтобы помочь мне создать тело письма, основанное на значениях, скопированных с веб-сайта.
Но у меня проблемы с заменой заполнителей на значения.
Мой код «заменить заполнитель» выглядит следующим образом:
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,
);
Массивы состоят из пар или значений ключей, и для каждого возвращаемого массива я перебираю свой шаблон электронной почты в поисках заполнителя в формате # key # ->, например, # 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 и затем завершается (потому что после первого пробела не осталось заполнителей).
Переменная $ 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 #).
Я хочу заменить заполнитель # ONELINER # значением oneliner для продукта 1 при первой встрече с заполнителем. Во второй раз это должно быть значение для продукта 2 и так далее …
Надеюсь, это имеет смысл.
ОБНОВИТЬ
Вот пример массива продуктов, который необходимо заменить в моем шаблоне. По просьбе динамического.
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/
На самом деле для такой простой замены вам не нужно 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);
Других решений пока нет …