<?php
$text = file_get_contents(__DIR__ . '/20720351_2010_-_1_unicode.xml');
$text = iconv('UTF-16LE', 'UTF-8', $text);
// http://stackoverflow.com/a/12265956
$text = preg_replace('/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}]+/u', ' ', $text);
$element = simplexml_load_string($text);
var_dump($element);
Этот оператор не избавляет от ошибки, а просто скрывает ее вывод.
Очень не рекомендую. Говорю как ZCE.
$c = @$a ? : 'default';
никаких E_NOTICE не выдаётся. Возможно, у Вас установлен свой обработчик ошибок (через set_error_handler), который игнорирует оператор "@". function setUp() {
$this->setBrowser('firefox');
$this->setBrowserUrl('');
}
function testDo() {
$this->url('https://www.facebook.com/facebook');
$this->url('http://www.opera.com/computer');
}
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
(function(){
// Выполняем код только на мобильных браузерах (на всякий случай)
if (typeof(window.orientation) !== 'undefined')
{
// Функция взята отсюда: https://makandracards.com/makandra/13743-detect-effective-horizontal-pixel-width-on-a-mobile-device-with-javascript
function getDeviceWidth()
{
var deviceWidth = window.orientation == 0 ? window.screen.width : window.screen.height;
// iOS returns available pixels, Android returns pixels / pixel ratio
// http://www.quirksmode.org/blog/archives/2012/07/more_about_devi.html
if (navigator.userAgent.indexOf('Android') >= 0 && window.devicePixelRatio)
deviceWidth = deviceWidth / window.devicePixelRatio;
return deviceWidth;
}
var deviceWidth = getDeviceWidth();
var maxWidth = 900;
if (deviceWidth < maxWidth)
{
// Мои эксперименты на iPad 2 показали, что device-width всегда содержит значение ширины
// экрана в книжной (portrait) ориентации (т.е. даже, если устройство находится в
// альбомной (landscape) ориентации). Это же утверждалось в некоторых найденных мною статьях.
if (window.orientation == 0 || window.orientation == 180)
document.write('<meta name="viewport" content="width=device-width">');
else
document.write('<meta name="viewport" content="width=device-height">');
}
else
document.write('<meta name="viewport" content="width=' + maxWidth + '">');
}
})();
</script>
<style type="text/css">
* { margin: 0; padding: 0; }
.content { min-width: 320px; max-width: 900px; background: #ffff99; }
.content div { border: 1px solid #f00; }
</style>
</head>
<body>
<div class="content">
<div>
abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc
abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc
abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc
</div>
</div>
</body>
</html>
Ни в одном школьном учебнике «допущенном» или «рекомендованом» нет текста сообщающего, что копирование и распространение запрещено (обычно такой абзац присутствует в начале книге на странице с информацией об авторах, издательстве и т.п.). Почему?
Правообладатель может по своему усмотрению разрешать или запрещать другим лицам использование результата интеллектуальной деятельности или средства индивидуализации. Отсутствие запрета не считается согласием (разрешением).
Однако издательства обычно ставят значок копирайта «Все права защищены».
Правообладатель для оповещения о принадлежащем ему исключительном праве на произведение вправе использовать знак охраны авторского права, который помещается на каждом экземпляре произведения и состоит из следующих элементов:
латинской буквы «C» в окружности;
имени или наименования правообладателя;
года первого опубликования произведения.
Как это следует понимать? Можно ли так: государство, гарантирующее бесплатное среднее образование, заказывает разработку учебников и содержание учебников является бесплатным для населения.
С другой стороны издательства заявляют права на свою верстку, т.е. нельзя распространять учебник в отсканированном виде, т.е. так, как его оформило издательство.
Тогда получается, что можно взять «рекомендованный» учебник, оцифровать, сверстать в форматах электронных книг. Или при этом все-таки будут нарушены чьи-то имущественные права (автор несомненно будет указан).
<?php
$html = '
<p>Текст</p>
<htmlpagefooter name="myFooter" style="display:none">
<div class="footer">
<table class="tbl3" width=624>
<tr>
<td>Менеджера</td>
<td>Вася Пупкин</td>
</tr>
<tr>
<td>Телефон:</td>
<td>222 333 222</td>
</tr>
</table>
</div>
</htmlpagefooter>
<sethtmlpagefooter name="myFooter" />';
require_once __DIR__ . '/MPDF57/mpdf.php';
$mpdf = new mPDF('utf-8', 'A4', '12', '', 10, 10, 7, 7, 10, 10);
//$mpdf->allow_charset_conversion = true;
$mpdf->charset_in = 'cp1251';
$mpdf->list_indent_first_level = 0;
$mpdf->WriteHTML($html, 0);
echo $mpdf->Output('mpdf.pdf', 'I');
die;
<?php
$html = '"текст в кавычках" текст "ещё текст в кавычках" <a href="http://ya.ru"><em>неправильный порядок вложенности элементов</a></em> текст <div>незакрытый элемент';
$domDocument = loadHtml($html);
$xpath = new DOMXpath($domDocument);
// Выбирает только текстовые узлы
foreach ($xpath->query('/html/body//text()') as $textNode)
{
// Тут можно производить замены кавычек, учитывая текст из предыдущих $textNode
$textNode->data = str_replace('"', '«', $textNode->data);
}
print htmlspecialchars(saveHtml($domDocument));
/*
Выведет:
«текст в кавычках« текст «ещё текст в кавычках« <a href="http://ya.ru"><em>неправильный порядок вложенности элементов</em></a> текст <div>незакрытый элемент</div>
*/
<?php
/**
* @return DOMDocument
*/
function loadHtml($html, $charset = 'utf-8')
{
$domDocument = new DOMDocument();
// Т.к. функция DOMDocument::loadHTML конвертирует сущности " " в обычные пробелы,
// приходится экранировать эти сущности. Засипи вида "&nbsp;" экранируем для того,
// чтобы при обратном преобразовании они по ошибке не превратились в " "
$html = str_replace('&nbsp;', '&amp;nbsp;', $html);
$html = str_replace(' ', '&nbsp;', $html);
// Удаляем символы "\r", т.к. DOMDocument::loadHTML() преобразует их в " "
$html = str_replace("\r", '', $html);
$html = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=' . $charset . '"/>
<title></title>
</head>
<body>' . $html . '</body>
</html>
';
// Функция DOMDocument::loadHTML может генерировать сообщения об ошибках, которые нам
// не нужны (например, о незакрытом теге), т.к. мы используем данную функцию для
// коррекции HTML кода. Оператор @ ошибки у данной функции не подавляет.
$useErrorsOld = libxml_use_internal_errors(true);
$domDocument->loadHTML($html);
libxml_use_internal_errors($useErrorsOld);
return $domDocument;
}
/**
* @return string
*/
function saveHtml(DOMDocument $domDocument)
{
// Экспортируем в формате XHTML
$html = $domDocument->saveXml();
$html = str_replace('&nbsp;', ' ', $html);
$html = str_replace('&amp;nbsp;', '&nbsp;', $html);
$html = preg_replace('/^\s*\<\?xml\s*[^\>]*\>\s*/is', '', $html);
// Удаляем <![CDATA[]]>, которым оборачивается содержимое тега <script></script> при
// экспорте через DOMDocument::saveXml
$html = preg_replace('/(\<script(\s*[^\>]*)?\>)\<\!\[CDATA\[/is', '$1', $html);
$html = preg_replace('/\]\]\>(\<\/script\>)/is', '$1', $html);
return preg_replace('/^.*?<body>(.*?)<\/body>\s*<\/html>$/is', '$1', $html);
}
var makeGroup = function(name,fun) {
var newgroup = new group();
newgroup.name=name;
newgroup.status='ok';
newgroup.stack=[];
var oldRoot = root;
root = newgroup;
try {
fun();
}
catch(e) {
newgroup.status=e;
}
root = oldRoot;
root.stack.push(newgroup);
}
Ок. Делаю замену как предлагает Ogra:
— $body = iconv($data_charset, $send_charset, $body);
+ $body = iconv('utf-8', 'cp1252', $body);
+ $body = iconv('cp1251', 'KOI8-R', $body);
Теперь тело сообщения вообще пустое.
Причем $body теряется при utf-8=>cp1252.