更新:下面的“解决方案”made me a headache 正是这一行:
$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');
它将所有非ASCII字符转换为实体,这不是很聪明。 Javascript 的 confirm 和 alert 函数不会将其转换回 UTF-8,它们会按原样显示字符串。
谢谢大家,但我认为我不够清楚:) 我的意思不是通过 css 格式化或通常更改呈现页面的外观,而是更改 HTML source 代码。
不管怎样,有了这两篇文章,我终于做到了我想要的:
How do you format DOM structures in PHP?
http://php-and-symfony.matthiasnoback.nl/2011/10/symfony2-create-a-response-filter-and-set-extra-response-headers/
第 1 步。
所以,首先是响应监听器,在(例如)AppBundle/EventListener/ResponseListener.php 中:
namespace AppBundle\EventListener;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\DependencyInjection\ContainerInterface as Container;
class ResponseListener {
private $container;
public function __construct(Container $container) {
$this->container = $container;
}
function tidyHtml($html)
{
$dom = new \DOMDocument();
if (libxml_use_internal_errors(true) === true)
{
libxml_clear_errors();
}
$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');
$html = preg_replace(array('~\R~u', '~>[[:space:]]++<~m'), array("\n", '><'), $html);
if ((empty($html) !== true) && ($dom->loadHTML($html) === true))
{
$dom->formatOutput = true;
if (($html = $dom->saveXML($dom->documentElement, LIBXML_NOEMPTYTAG)) !== false)
{
$regex = array
(
'~' . preg_quote('<![CDATA[', '~') . '~' => '',
'~' . preg_quote(']]>', '~') . '~' => '',
'~></(?:area|base(?:font)?|br|col|command|embed|frame|hr|img|input|keygen|link|meta|param|source|track|wbr)>~' => ' />',
);
return '<!DOCTYPE html>' . "\n" . preg_replace(array_keys($regex), $regex, $html);
}
}
return false;
}
public function onKernelResponse(FilterResponseEvent $event) {
$request = $event->getRequest();
//only when format == html and environment == dev
if ($request->getRequestFormat() == 'html' && $this->container->get('kernel')->getEnvironment() == 'dev') {
$event->getResponse()->setContent($this->tidyHtml($event->getResponse()->getContent()));
}
}
}
第 2 步。
在 services.yml 中:
response_listener:
class: AppBundle\EventListener\ResponseListener
arguments: ['@service_container']
tags:
- { name: kernel.event_listener, event: kernel.response, method : onKernelResponse }