Как я могу разобрать текст заполнителя в HTML-файле, который затем заменяется пользовательскими тегами?

#html #parsing #email

#HTML #синтаксический анализ #Адрес электронной почты

Вопрос:

Сначала немного справочной информации. Я создаю электронные письма в формате HTML на своем рабочем месте, и весь процесс очень утомителен. Это немного похоже на это…

  1. Разметка кода для HTML с использованием таблиц и некоторых элементов CSS
  2. Разбирайте HTML и CSS с помощью Premailer, чтобы весь CSS был встроенным
  3. Тестовый HTML работает во всех почтовых клиентах
  4. Создайте копию встроенной версии HTML и начните добавлять собственные переменные в инструмент электронной почты, используемый для отправки электронных писем, т.Е. <%=constant.first_name%> , <%=unsubscribe_link%>
  5. Протестируйте в почтовом клиенте, чтобы увидеть, работает ли это и доволен ли клиент. Если нет, повторите шаги с 1 по 5 снова.

Итак, как вы можете видеть, через некоторое время это становится действительно утомительным.

Что я хотел бы сделать, так это создать скрипт командной строки, подобный Premailer, который позволяет мне анализировать HTML-файл с сохраненными в нем переменными, не уничтожая текст примера, уже имеющийся в HTML. Таким образом, при предварительном просмотре HTML все выглядит превосходно.

Например…

Сохраните функцию first name как переменную для собственного использования.

 $first_name = "<%=constant.first_name%>
  

Затем сообщите анализатору, какое слово (ы) заменить соответствующей переменной.

 <p>My name is <!-- $first_name -->Gavin<!-- /$first_name --></p>
  

Так что конечный результат выглядит примерно так:

 <p>My name is <%=constat.first_name%></p>
  

Возможно ли такое? Есть ли лучший синтаксис, который я мог бы использовать, например, пользовательский тег <first_name>Gavin</first_name> , если браузер может с этим справиться.

Любой совет полезен. 🙂

Ответ №1:

Я видел, как это делалось раньше, используя синтаксис типа:

 {assign_variable:first_name="Jesse"}
  

Тогда вы могли бы использовать его как:

 {first_name}
  

Способ, которым вы бы проанализировали это (при условии, что вы используете PHP), был бы примерно таким:

 <?php
// Our Template Code
$strHTML = <<<EOT

    {assign_variable:first_name="Jesse"}
    {assign_variable:last_name="Bunch"}

    Hello, {first_name}!

EOT;

// Get all the variables
$arrMatches = array();
preg_match_all('/{assign_variable:([a-zA-Z_-]*)="([a-zA-Z0-9] )"}/', $strHTML, $arrMatches);

// Remove the assign_variable tags
$strHTML = preg_replace('/{assign_variable:([a-zA-Z_-]*)="([a-zA-Z0-9] )"}/', '', $strHTML);

// Combine them into key/values
$arrVariables = array_combine($arrMatches[1], $arrMatches[2]);
foreach($arrVariables as $key=>$value) {

    // Replace the variable occurrences
    $strHTML = str_replace('{' . $key . '}', $value, $strHTML);

}

// Send the parsed template
echo $strHTML;
  

Какие результаты:

 Hello, Jesse!
  

Обратите внимание, это очень простой пример. Вот некоторые улучшения, которые необходимо внести в этот код перед использованием его в рабочей среде:

  • Отредактируйте регулярное выражение, чтобы разрешить использование правильных символов.
  • Возможно, реализовать лучший метод замены, чем цикл
  • Проверьте, нет ли ошибок синтаксического анализа
  • Тест производительности

В целом, я думаю, вы поняли идею. Надеюсь, это укажет вам правильное направление.

Комментарии:

1. Привет, Джесси, это, безусловно, то, о чем я никогда раньше не задумывался. Меня беспокоит только то, что мне нужно иметь возможность сохранить HTML, который я могу скопировать и вставить в инструмент электронной почты для отправки электронного письма. Что заставляет меня думать, что я, возможно, не смогу достичь этого в PHP : (. Бит, который мне нужно добавить в инструмент электронной почты, это <p> Привет, <%first_name%></p> вместо <p> Привет, Джесси</ p>. Но при разработке html мне нужно иметь возможность видеть «Привет, Джесси», а не «Привет, <%first_name%>». Я надеюсь, что это делает его более понятным. Еще раз спасибо.

2. Еще раз просмотрев ваш ответ, я понял, что могу просто скопировать выведенный html из браузера. Спасибо.

Ответ №2:

У меня похожая ситуация
Я создал «шаблон формата», подобный этому:

 <?php // section1 $var1/$var2  ?>
<head>
   <title>$var1</title>
   <meta name="description" content="$var2">
</head>
<?php // section2 $var1/$var2  ?>
<body>
   hello: <p>$var1</p>
   news for you: <p>$var2</p>
</body>
  

это действительный php-код и действительный html-код, поэтому вы можете редактировать его с помощью dreamwaver или аналогичного, и вы также можете разместить его.
затем php-скрипт заменяет все значения переменных во всех разделах.

Комментарии:

1. Привет, Луис, спасибо за предложение. Кажется достаточно простым, единственная проблема в том, что мне нужно решение, которое просматривает правильный текст, в котором указаны переменные. Например, вместо того, чтобы видеть «hello: $ var1» при предварительном просмотре в браузере, вы увидите «hello: Luis», но при анализе он будет сохранен как «<p> hello: <%=weird_email_client_tags_here%></p>. Объяснить это сложнее, чем я думал, я надеюсь, что это имеет смысл.

2. итак, примите или разработайте шаблон и создайте скрипт с шаблоном в качестве входных и двумя выходными файлами, которые вам нужны. ваш шаблон, как и предлагалось, должен быть совместим с «редакторами» и легко трансформироваться в желаемый результат. если вам нужна помощь с настройками, используйте @Jesse Bunch хороший подход или другой, или спросите еще раз, но это должен быть отдельный скрипт

3. Вы правы, я не уверен, почему я пытался усложнить себе жизнь. Я мог бы просто иметь 2 набора переменных и переключать их при необходимости.