Intereting Posts
Структура таблицы laravel, показывающая наиболее понравившиеся статьи и меньше просмотров Как удалить акценты и превратить буквы в «простые» символы ASCII? Задержка сна PHP Laravel 5: исключение MassAssignmentException в Model.php Как отправить деньги на paypal, используя php Преобразование SVG в PNG / JPEG / BMP и наоборот? функция ошибки выполняет () в булевом режиме, предотвращая дублирование Как запускать или загружать файлы .po / .mo для локализации в php Почему var_dump устанавливает значения частных переменных, но при попытке доступа к одному свойству Как изменить eregi PHP на preg_match Обновите div, но только если есть новый контент из php-файла Простой способ отправки электронной почты с помощью javascript и PHP Блокирующие серверы TOR PHP-код может вставить изображение в файл excel и правильно его открыть в MS Excel? Laravel удаляет только модель, если не существует соответствующей модели

Заменить несколько заполнителей PHP?

У меня есть функция, которая отправляет электронные письма с сайта (с использованием phpmailer), что я хочу сделать, это в основном для php, чтобы заменить всех plachholders в файле email.tpl содержимым, которое я его кормлю. Проблема для меня заключается в том, что я не хочу повторять код, поэтому я создал функцию (ниже).

Без функции php я бы сделал следующее в скрипте

// email template file $email_template = "email.tpl"; // Get contact form template from file $message = file_get_contents($email_template); // Replace place holders in email template $message = str_replace("[{USERNAME}]", $username, $message); $message = str_replace("[{EMAIL}]", $email, $message); 

Теперь я знаю, как сделать все остальное, но я застрял на str_replace() , как показано выше. У меня есть несколько str_replace() для замены заполнителей в шаблоне электронной почты. Я хотел бы добавить str_replace() к моей функции (ниже) и получить ее, чтобы найти все экземпляры [\] в шаблоне электронной почты, которые я им даю, и заменить ее значениями заполнителей, которые я вам дам следующим образом: str_replace("[\]", 'replace_with', $email_body)

Проблема в том, что я не знаю, как передать несколько заполнителей и их заменяющие значения в свою функцию и получить str_replace("[{\}]", 'replace_with', $email_body) для обработки всех заполнителей, которые я им даю, и замените там соответствующие значения.

Поскольку я хочу использовать эту функцию в нескольких местах и ​​избегать дублирования кода, на некоторых скриптах я могу передать функцию 5 заполнителей и там значения, а другой скрипт может понадобиться передать 10 заполнителей, а также значения функции, которые будут использоваться в шаблоне электронной почты.

Я не уверен, что мне нужно будет использовать массив для скриптов, которые будут использовать функцию и цикл for в функции, возможно, чтобы заставить мою php-функцию принимать xx-метки и значения xx из сценария и для прокрутки заполнителей и замены их там значений.

Вот моя функция, о которой я говорил выше. Я прокомментировал сценарий, который может объяснить гораздо проще.

 // WILL NEED TO PASS PERHAPS AN ARRAY OF MY PLACEHOLDERS AND THERE VALUES FROM x SCRIPT // INTO THE FUNCTION ? function phpmailer($to_email, $email_subject, $email_body, $email_tpl) { // include php mailer class require_once("class.phpmailer.php"); // send to email (receipent) global $to_email; // add the body for mail global $email_subject; // email message body global $email_body; // email template global $email_tpl; // get email template $message = file_get_contents($email_tpl); // replace email template placeholders with content from x script // FIND ALL INSTANCES OF [{}] IN EMAIL TEMPLATE THAT I FEED THE FUNCTION // WITH AND REPLACE IT WITH THERE CORRESPOING VALUES. // NOT SURE IF I NEED A FOR LOOP HERE PERHAPS TO LOOP THROUGH ALL // PLACEHOLDERS I FEED THE FUNCTION WITH AND REPLACE WITH THERE CORRESPONDING VALUES $email_body = str_replace("[{\}]", 'replace', $email_body); // create object of PHPMailer $mail = new PHPMailer(); // inform class to use smtp $mail->IsSMTP(); // enable smtp authentication $mail->SMTPAuth = SMTP_AUTH; // host of the smtp server $mail->Host = SMTP_HOST; // port of the smtp server $mail->Port = SMTP_PORT; // smtp user name $mail->Username = SMTP_USER; // smtp user password $mail->Password = SMTP_PASS; // mail charset $mail->CharSet = MAIL_CHARSET; // set from email address $mail->SetFrom(FROM_EMAIL); // to address $mail->AddAddress($to_email); // email subject $mail->Subject = $email_subject; // html message body $mail->MsgHTML($email_body); // plain text message body (no html) $mail->AltBody(strip_tags($email_body)); // finally send the mail if(!$mail->Send()) { echo "Mailer Error: " . $mail->ErrorInfo; } else { echo "Message sent Successfully!"; } } 

Простой, см. strtr Docs :

 $vars = array( "[{USERNAME}]" => $username, "[{EMAIL}]" => $email, ); $message = strtr($message, $vars); 

Добавьте столько (или как меньше) заменяющих пар, сколько захотите. Но я предлагаю, вы обрабатываете шаблон, прежде чем вы вызываете функцию phpmailer , поэтому все остается в стороне: шаблоны и отправка почты:

 class MessageTemplateFile { /** * @var string */ private $file; /** * @var string[] varname => string value */ private $vars; public function __construct($file, array $vars = array()) { $this->file = (string)$file; $this->setVars($vars); } public function setVars(array $vars) { $this->vars = $vars; } public function getTemplateText() { return file_get_contents($this->file); } public function __toString() { return strtr($this->getTemplateText(), $this->getReplacementPairs()); } private function getReplacementPairs() { $pairs = array(); foreach ($this->vars as $name => $value) { $key = sprintf('[{%s}]', strtoupper($name)); $pairs[$key] = (string)$value; } return $pairs; } } 

Использование может быть значительно упрощено, и вы можете передать весь шаблон любой функции, которая требует ввода строки.

 $vars = compact('username', 'message'); $message = new MessageTemplateFile('email.tpl', $vars); 

Решениями PHP могут быть:

  • использование простых механизмов замены %placeholder% :
    • str_replace ,
    • strtr ,
    • preg_replace
  • использование чистого PHP-шаблона и условной логики ( короткие открытые теги в PHP и альтернативный синтаксис для структур управления )

Пожалуйста, найдите широкий ответ на Programmers.StackExchange, чтобы узнать другие подходы к шаблонам PHP по электронной почте .

Почему бы вам просто не создать шаблон электронной почты для php-файла? Тогда вы можете сделать что-то вроде:

 Hello <?=$name?>, my name is <?=$your_name?>, today is <?=$date?> 

внутри электронной почты, чтобы сгенерировать ваш HTML-код, а затем отправить результат в виде электронной почты.

Кажется мне, как вы это делаете с трудом?