При выводе от html до php существует несколько общих подходов.
Шаблоны. Наиболее распространенным решением для систем типа Extensible CMS является создание шаблонов (Wordpress, Joomla, Drupal и др. c). Вы пишете html файл с большим количеством <?php echo $variable ?>
внутри них. Вот некоторые замечательные расширения php, которые делают это намного проще, такие как Twig. Это сделано для того, чтобы шаблоны можно было повторно использовать и легко настраивать в многоцелевой среде CMS. Это, вероятно, самый лучший и наиболее используемый вариант. Чтобы узнать об этом, загляните в Twig или получите книгу по интерфейсу WordPress.
Raw html в коде. Это то, что вы пытаетесь, и, как вы можете видеть, не идеально. Он подвержен ошибкам и труден для чтения.
Для выделенных сайтов или небольших сайтов, где система шаблонов будет чрезмерной, я хотел бы использовать своего рода наизнанку подход к созданию html. У меня есть несколько вспомогательных функций, которые я использую для создания динамического c html в хорошем формате, и его легко читать. Пример:
function buildAttr($attr)
{
assert(is_array($attr), 'abilities passed to buildAttr should be an array().');
$attr_string = '';
foreach ($attr as $name => $value)
{
if (is_numeric($name))
{
continue;
}
if (is_array($value))
{
$value = implode(' ', $value);
}
$attr_string .= ' ' . $name . '="' . $value . '"';
}
return $attr_string;
}
function htmlWrap($tag, $content, $attr = array())
{
return '<' . $tag . buildAttr($attr) . '>' . $content . '</' . $tag . '>';
}
function htmlSolo($tag, $attr = array())
{
return '<' . $tag . buildAttr($attr) . '>';
}
Использование этого будет выглядеть примерно так:
$output = '';
// Label.
$attr = array('class' => array('label'), 'for' => $name);
$output .= htmlWrap('label', $this->label, $attr);
$attr = array();
$attr['name'] = $this->id;
$attr['type'] = 'text';
$output .= htmlWrap('input', '', $attr);
// Wrapper.
$attr = array('class' => array('field', 'text', $name));
$output = htmlWrap('div', $output, $attr);
return $output;
Важное замечание, что каждый раз, когда вы выводите пользовательский ввод как html, вам нужно для защиты от атак XSS и HTML. Поэтому любой пользовательский ввод, который вы передаете в эти функции, должен сначала пройти через функцию очистки. Что-то вроде:
function sanitize($data)
{
if (is_null($data))
{
return '';
}
assert(is_string($data) || is_numeric($data) || is_bool($data), 'Non-string passed to sanitize!');
$data = trim($data);
$data = htmlspecialchars($data, ENT_IGNORE | ENT_QUOTES);
return $data;
}