Php вставить html из файла
Используем Nunjucks
Nunjucks тоже содержит расширения . Используйте следующий код:
Если поместить код в файл index.njk, то его можно обработать с помощью простого скрипта Node в index.html:
Также этот код можно обработать с помощью gulp-nunjucks .
User Contributed Notes 21 notes
This might be useful:
include $_SERVER [ 'DOCUMENT_ROOT' ]. "/lib/sample.lib.php" ;
?>
So you can move script anywhere in web-project tree without changes.
If you want to have include files, but do not want them to be accessible directly from the client side, please, please, for the love of keyboard, do not do this:
// check if what is defined and die if not
?>
The reason you should not do this is because there is a better option available. Move the includeFile(s) out of the document root of your project. So if the document root of your project is at "/usr/share/nginx/html", keep the include files in "/usr/share/nginx/src".
include __DIR__ . '/../src/includeFile.php' ;
?>
Since user can't type 'your.site/../src/includeFile.php', your includeFile(s) would not be accessible to the user directly.
Before using php's include, require, include_once or require_once statements, you should learn more about Local File Inclusion (also known as LFI) and Remote File Inclusion (also known as RFI).
The LFI and RFI vulnerabilities occur when you use an input variable in the include statement without proper input validation. Suppose you have an example.php with code:
// Bad Code
$path = $_GET [ 'path' ];
include $path . 'example-config-file.php' ;
?>
As a programmer, you might expect the user to browse to the path that you specify.
The example.php would download my evil.txt and process the operating system command that I passed in as the command variable. In this case, it is whoami. I ended the path variable with a %00, which is the null character. The original include statement in the example.php would ignore the rest of the line. It should tell me who the web server is running as.
Please use proper input validation if you use variables in an include statement.
I cannot emphasize enough knowing the active working directory. Find it by: echo getcwd();
Remember that if file A includes file B, and B includes file C; the include path in B should take into account that A, not B, is the active working directory.
When including a file using its name directly without specifying we are talking about the current working directory, i.e. saying (include "file") instead of ( include "./file") . PHP will search first in the current working directory (given by getcwd() ) , then next searches for it in the directory of the script being executed (given by __dir__).
This is an example to demonstrate the situation :
We have two directory structure :
-dir1
----script.php
----test
----dir1_test
-dir2
----test
----dir2_test
dir1/test contains the following text :
This is test in dir1
dir2/test contains the following text:
This is test in dir2
dir1_test contains the following text:
This is dir1_test
dir2_test contains the following text:
This is dir2_test
script.php contains the following code:
echo 'Directory of the current calling script: ' . __DIR__ ;
echo '
' ;
echo 'Current working directory: ' . getcwd ();
echo '
' ;
echo 'including "test" . ' ;
echo '
' ;
include 'test' ;
echo '
' ;
echo 'Changing current working directory to dir2' ;
chdir ( '../dir2' );
echo '
' ;
echo 'Directory of the current calling script: ' . __DIR__ ;
echo '
' ;
echo 'Current working directory: ' . getcwd ();
echo '
' ;
echo 'including "test" . ' ;
echo '
' ;
include 'test' ;
echo '
' ;
echo 'including "dir2_test" . ' ;
echo '
' ;
include 'dir2_test' ;
echo '
' ;
echo 'including "dir1_test" . ' ;
echo '
' ;
include 'dir1_test' ;
echo '
' ;
echo 'including "./dir1_test" . ' ;
echo '
' ;
(@include './dir1_test' ) or die( 'couldn\'t include this file ' );
?>
The output of executing script.php is :
Directory of the current calling script: C:\dev\www\php_experiments\working_directory\example2\dir1
Current working directory: C:\dev\www\php_experiments\working_directory\example2\dir1
including "test" .
This is test in dir1
Changing current working directory to dir2
Directory of the current calling script: C:\dev\www\php_experiments\working_directory\example2\dir1
Current working directory: C:\dev\www\php_experiments\working_directory\example2\dir2
including "test" .
This is test in dir2
including "dir2_test" .
This is dir2_test
including "dir1_test" .
This is dir1_test
including "./dir1_test" .
couldn't include this file
If you're doing a lot of dynamic/computed includes (>100, say), then you may well want to know this performance comparison: if the target file doesn't exist, then an @include() is *ten* *times* *slower* than prefixing it with a file_exists() check. (This will be important if the file will only occasionally exist - e.g. a dev environment has it, but a prod one doesn't.)
As a rule of thumb, never include files using relative paths. To do this efficiently, you can define constants as follows:
----
define ( 'MAINDIR' , dirname ( __FILE__ ) . '/' );
define ( 'DL_DIR' , MAINDIR . 'downloads/' );
define ( 'LIB_DIR' , MAINDIR . 'lib/' );
?>
----
and so on. This way, the files in your framework will only have to issue statements such as this:
require_once( LIB_DIR . 'excel_functions.php' );
?>
This also frees you from having to check the include path each time you do an include.
If you're running scripts from below your main web directory, put a prepend.php file in each subdirectory:
--
include( dirname ( dirname ( __FILE__ )) . '/prepend.php' );
?>
--
This way, the prepend.php at the top always gets executed and you'll have no path handling headaches. Just remember to set the auto_prepend_file directive on your .htaccess files for each subdirectory where you have web-accessible scripts.
Ideally includes should be kept outside of the web root. That's not often possible though especially when distributing packaged applications where you don't know the server environment your application will be running in. In those cases I use the following as the first line.
( __FILE__ != $_SERVER['SCRIPT_FILENAME'] ) or exit ( 'No' );
It's worth noting that PHP provides an OS-context aware constant called DIRECTORY_SEPARATOR. If you use that instead of slashes in your directory paths your scripts will be correct whether you use *NIX or (shudder) Windows. (In a semi-related way, there is a smart end-of-line character, PHP_EOL)
Example:
$cfg_path
= 'includes'
. DIRECTORY_SEPARATOR
. 'config.php'
;
require_once( $cfg_path );
I would like to point out the difference in behavior in IIS/Windows and Apache/Unix (not sure about any others, but I would think that any server under Windows will be have the same as IIS/Windows and any server under Unix will behave the same as Apache/Unix) when it comes to path specified for included files.
Consider the following:
include '/Path/To/File.php' ;
?>
In IIS/Windows, the file is looked for at the root of the virtual host (we'll say C:\Server\Sites\MySite) since the path began with a forward slash. This behavior works in HTML under all platforms because browsers interpret the / as the root of the server.
However, Unix file/folder structuring is a little different. The / represents the root of the hard drive or current hard drive partition. In other words, it would basically be looking for root:/Path/To/File.php instead of serverRoot:/Path/To/File.php (which we'll say is /usr/var/www/htdocs). Thusly, an error/warning would be thrown because the path doesn't exist in the root path.
I just thought I'd mention that. It will definitely save some trouble for those users who work under Windows and transport their applications to an Unix-based server.
A work around would be something like:
$documentRoot = null ;
if (isset( $_SERVER [ 'DOCUMENT_ROOT' ])) $documentRoot = $_SERVER [ 'DOCUMENT_ROOT' ];
if ( strstr ( $documentRoot , '/' ) || strstr ( $documentRoot , '\\' )) if ( strstr ( $documentRoot , '/' )) $documentRoot = str_replace ( '/' , DIRECTORY_SEPARATOR , $documentRoot );
>
elseif ( strstr ( $documentRoot , '\\' )) $documentRoot = str_replace ( '\\' , DIRECTORY_SEPARATOR , $documentRoot );
>
>
if ( preg_match ( '/[^\\/]\\[^\\/]/' , $documentRoot )) $documentRoot = preg_replace ( '/([^\\/])\\([^\\/])/' , '\\1DIR_SEP\\2' , $documentRoot );
$documentRoot = str_replace ( 'DIR_SEP' , '\\\\' , $documentRoot );
>
>
else /**
* I usually store this file in the Includes folder at the root of my
* virtual host. This can be changed to wherever you store this file.
*
* Example:
* If you store this file in the Application/Settings/DocRoot folder at the
* base of your site, you would change this array to include each of those
* folders.
*
*
* $directories = array(
* 'Application',
* 'Settings',
* 'DocRoot'
* );
*
*/
$directories = array(
'Includes'
);
if ( defined ( '__DIR__' )) $currentDirectory = __DIR__ ;
>
else $currentDirectory = dirname ( __FILE__ );
>
$currentDirectory = rtrim ( $currentDirectory , DIRECTORY_SEPARATOR );
$currentDirectory = $currentDirectory . DIRECTORY_SEPARATOR ;
foreach ( $directories as $directory ) $currentDirectory = str_replace (
DIRECTORY_SEPARATOR . $directory . DIRECTORY_SEPARATOR ,
DIRECTORY_SEPARATOR ,
$currentDirectory
);
>
$currentDirectory = rtrim ( $currentDirectory , DIRECTORY_SEPARATOR );
>
define ( 'SERVER_DOC_ROOT' , $documentRoot );
?>
Using this file, you can include files using the defined SERVER_DOC_ROOT constant and each file included that way will be included from the correct location and no errors/warnings will be thrown.
Используем Sergey
Есть еще один генератор статических сайтов (SSG), который стоит упомянуть. В Sergey есть формат стиля веб-компонентов:
Назовите файлы header.html и footer.html и поместите их в /includes/ . В этом случае Sergey выполнит сборку с обработанными подключениями, когда вы запустите скрипт npm.
Используем Pug
Pug – это препроцессор HTML с новым, более сжатым синтаксисом. Но он использует расширения (includes) .
Запустите код, приведенный выше, с помощью gulp-pug.
Список параметров
Начиная с версии Libxml 2.6.0, можно также использовать параметр options для указания дополнительных параметров Libxml.
Используем Jekyll
Jekyll – это генератор статических сайтов на основе Ruby с включениями . Они сохраняются в папке /_includes/, а затем:
Существует еще множество генераторов статических сайтов . Многие из них поддерживают подключение внешних HTML-файлов.
Динамические страницы и что для них нужно
Помимо статических есть ещё динамические страницы. Таких сейчас в Интернете большинство. Информация в них подгружается из внешних источников, например базы данных или других файлов. Содержимое и форматирование таких страниц может меняться в зависимости от действий пользователя. Для правки динамических сайтов не обязательно вмешиваться в их код – достаточно изменить контент в специально для него предназначенном файле или базе данных, которая, к слову, представляет собой тоже файл, только определённым образом структурированный.
Для создания динамических сайтов только HTML и CSS недостаточно. Тут используются ещё и языки программирования, а также базы данных и языки запросов к ним. Чаще всего современные динамические сайты используют в своей работе HTML, CSS, PHP, JavaScript, SQL. Первые две аббревиатуры вам уже знакомы не понаслышке, SQL применяется для доступа к базам данных, JavaScript — клиентский язык, команды которого обрабатываются браузером и зачастую используются, чтобы показывать вам всякую красоту вроде шторок или плавно открывающихся фотографий, а вот PHP — это серверный язык программирования, который работает, в том числе, с содержимым сайта и делает его динамическим, с ним мы сегодня и соприкоснёмся.
Используем Apache SSI
Apache также поддерживает подключения . Введите код, приведенный ниже:
Но вам понадобится правильная конфигурация Apache, чтобы все действия были разрешены. Я старался изо всех сил, чтобы найти рабочую демоверсию, но не смог.
Используем Handlebars
У Handlebars есть шаблоны (partials). Их необходимо зарегистрировать:
Теперь их можно использовать:
В Handlebars также доступны средства для оценки и передачи данных. Чтобы запустить их, понадобится плагин типа gulp-handlebars .
Примеры
Используем CodeKit
CodeKit включает в себя специальный язык Kit , 90% функций которого необходимы только для подключений. Kit использует специальные комментарии в HTML:
Подключение PHP-скриптов (файлы с расширением *.php) к сайту
Подключение PHP-скриптов осуществляется уже тремя способами:
1. Первый – это та же вставка кода в саму страницу сайта (обратите внимание, что если вы имеете страницу с расширением *.html – вам необходимо сменить расширение на *.php) с помощью тегов:
2. С помощью файла (в таком случае подключение можно осуществлять и на странице с *.html расширением):
Но для работы этого способа в файл .htaccess, который находится в корне вашего сайта, в самый верх, необходимо добавить эти строки:
Если такого файла нет на хостинге - создайте его через любой текстовый редактор.
3. Третье – с помощью JS-скрипта. В этом случае вы также можете получить результат выполненного PHP-скрипта на сервере.
Реализация будет следующая:
Где «.result» – это класс, куда будут грузиться данные, а «/main.php», соответственно, адрес до PHP-скрипта.
Если вы грузите данные с другого сервера, то поддержка PHP на вашем сервере не обязательна. Не забывайте подключить к вашему сайту библиотеку jQuery.
Здесь правила абсолютно те же: полный адрес к файлу, если он находится на внешнем сервере, относительный – если на вашем.
Обратите внимание! Если вы хотите подключить PHP-скрипт к вашему сайту, то на сервере должна быть поддержка PHP. О том, есть ли у вас такая возможность – узнайте у своего хостинг-провайдера.
Меня всегда удивляло то, что в HTML нельзя подключать другие HTML-файлы. Вот если бы можно было так:
Но приведенный выше код не работает.
Многие решают данную проблему с помощью других языков программирования.
Пример использования команды include
В предыдущей статье я рассказывал о блочной вёрстке сайта и приводил в пример простейшую страницу (документ index.html и привязанный к нему файл style.css).
Сейчас мы разделим документ index.html на несколько файлов, каждый из которых будет содержать свою часть страницы, что поможет ещё сильней разделить код, улучшить структуру шаблона и, по сути, сделать страницу динамической. Для этой цели мы будем использовать язык PHP, а точнее лишь одну его директиву — функцию include(), которая включает один файл в другой.
1. Смените разрешение созданного в статье о блочной вёрстке файла index с .html на .php, чтобы документ назывался index.php. Тип файла .PHP указывает серверу, что документ был написан или использует вставки на одноимённом языке программирования.
2. В папке со страницей создайте директорию blocks.
3. Всю вспомогательную информацию (верх, низ, навигацию и боковую панель сайта) вынесем в отдельные файлы, которые разместим в папке blocks.
Итак, создайте в каталоге blocks четыре файла: header.php, navigation.php, sidebar.php и footer.php. Заполните файлы кодом.
Сегодня я расскажу вам, как осуществляется подключение разных типов скриптов к вашему сайту. Это своего рода основа основ, и написать эту статью я должен был одной из первых. Потому – начнем.
Возвращаемые значения
Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. В случае статического вызова возвращает объект класса DOMDocument или false в случае возникновения ошибки.
Используем PHP
Может, стоит применять PHP?
Код, приведенный выше, обеспечивает подключение на уровне сервера. Запрос будет выполнен в файловой системе на сервере. Поэтому этот способ намного быстрее, чем решение, реализуемое на стороне клиента.
User Contributed Notes 18 notes
You can also load HTML as UTF-8 using this simple hack:
$doc = new DOMDocument ();
$doc -> loadHTML ( '' . $html );
// dirty fix
foreach ( $doc -> childNodes as $item )
if ( $item -> nodeType == XML_PI_NODE )
$doc -> removeChild ( $item ); // remove hack
$doc -> encoding = 'UTF-8' ; // insert proper
DOMDocument is very good at dealing with imperfect markup, but it throws warnings all over the place when it does.
This isn't well documented here. The solution to this is to implement a separate aparatus for dealing with just these errors.
Set libxml_use_internal_errors(true) before calling loadHTML. This will prevent errors from bubbling up to your default error handler. And you can then get at them (if you desire) using other libxml error functions.
When using loadHTML() to process UTF-8 pages, you may meet the problem that the output of dom functions are not like the input. For example, if you want to get "Cạnh tranh", you will receive "Cạnh tranh". I suggest we use mb_convert_encoding before load UTF-8 page :
$pageDom = new DomDocument ();
$searchPage = mb_convert_encoding ( $htmlUTF8Page , 'HTML-ENTITIES' , "UTF-8" );
@ $pageDom -> loadHTML ( $searchPage );
Pay attention when loading html that has a different charset than iso-8859-1. Since this method does not actively try to figure out what the html you are trying to load is encoded in (like most browsers do), you have to specify it in the html head. If, for instance, your html is in utf-8, make sure you have a meta tag in the html's head section:
If you do not specify the charset like this, all high-ascii bytes will be html-encoded. It is not enough to set the dom document you are loading the html in to UTF-8.
Warning: This does not function well with HTML5 elements such as SVG. Most of the advice on the Web is to turn off errors in order to have it work with HTML5.
For those of you who want to get an external URL's class element, I have 2 usefull functions. In this example we get the '
'
elements back (search result headers) from google search:
If we are loading html5 tags such as
DOMDocument::loadHTML(): Tag section invalid in Entity
We can disable standard libxml errors (and enable user error handling) using libxml_use_internal_errors(true); before loadHTML();
This is quite useful in phpunit custom assertions as given in following example (if using phpunit test cases):
// Create a DOMDocument
$dom = new DOMDocument();
// fix html5/svg errors
libxml_use_internal_errors(true);
// Load html
$dom->loadHTML(" ");
$htmlNodes = $dom->getElementsByTagName('section');
if ($htmlNodes->length == 0) $this->assertFalse(TRUE);
> else $this->assertTrue(TRUE);
>
Be aware that this function doesn't actually understand HTML -- it fixes tag-soup input using the general rules of SGML, so it creates well-formed markup, but has no idea which element contexts are allowed.
For example, with input like this where the first element isn't closed:
loadHTML will change it to this, which is well-formed but invalid:
It should be noted that when any text is provided within the body tagoutside of a containing element, the DOMDocument will encapsulate that
text into a paragraph tag (
).
Удалённые файлы могут быть обработаны на удалённой стороне (в зависимости от расширения файла и того, что удалённый сервер выполняет скрипты PHP или нет), но это всё равно должно производить корректный скрипт PHP, потому что он будет затем обработан уже на локальном сервере. Если файл с удалённого сервера должен быть обработан и только отображён его результат, гораздо эффективно воспользоваться функцией readfile() В противном случае следует соблюдать особую осторожность, чтобы обезопасить удалённый скрипт для получения корректного и желаемого кода.
Смотрите также раздел Удалённые файлы, функции fopen() и file() для дополнительной информации.
Обработка возвращаемых значений: оператор include возвращает значение FALSE в случае возникновения ошибки и выдаёт предупреждение. Успешные включения, пока это не переопределено во включаемом файле, возвращают значение 1 . Возможно выполнить выражение return внутри включаемого файла, чтобы завершить процесс выполнения в этом файле и вернуться к выполнению включающего файла. Кроме того, возможно вернуть значение из включаемых файлов. Вы можете получить значение включения, как если бы вы вызвали обычную функцию. Хотя это невозможно при включении удалённого файла, только если вывод удалённого файла не содержит корректные теги начала и конца PHP кода (так же, как и локальный файл). Вы можете определить необходимые переменные внутри этих тегов и они будут представлены в зависимости от того, какой файл был выключен.
Так как include - это специальная языковая конструкция, круглые скобки не обязательны вокруг аргумента. Будьте внимательны при сравнении возвращаемого значения.
// не сработает, интерпретируется как include(('vars.php') == TRUE), то есть include('1')
if (include( 'vars.php' ) == TRUE ) echo 'OK' ;
>
// сработает
if ((include 'vars.php' ) == TRUE ) echo 'OK' ;
>
?>
$foo = include 'return.php' ;
echo $foo ; // выведет 'PHP'
$bar = include 'noreturn.php' ;
echo $bar ; // выведет 1
$bar имеет значение 1 , т.к. включение файла произошло успешно. Заметьте разницу между примерами сверху. Первый использует return внутри включаемого файла, тогда как второй не использует. Если файл не может быть включён, возвращается false и возникает E_WARNING .
Если во включаемом файле определены функции, они могут быть использованы в главном файле вне зависимости от того, были ли они объявлены до return или после. Если файл включается дважды, PHP выдаст фатальную ошибку, потому что функции уже были определены. Рекомендуется использовать include_once вместо того, чтобы проверять был ли файл уже включён.
Другой путь "включить" PHP-файл в переменную - это захватить вывод с помощью функций контроля вывода вместе с include . Например:
$string = get_include_contents ( 'somefile.php' );
?phpfunction get_include_contents ( $filename ) if ( is_file ( $filename )) ob_start ();
include $filename ;
return ob_get_clean ();
>
return false ;
>
Для того, чтобы включать файлы автоматически в скрипты, обратите внимание на конфигурационные директивы auto_prepend_file и auto_append_file в php.ini .
Замечание: Поскольку это языковая конструкция, а не функция, она не может вызываться при помощи переменных функций или именованных аргументов.
Используем Ajax
Допустим, ваш документ выглядит следующим образом:
Можно вывести контент для шапки и подвала из соответствующих шаблонов.
Если вы создаете сайт, используя фреймворк JavaScript, то применяйте компоненты.
Заключение
Не уверен, что , которые запускают сетевые запросы во всем коде, станут хорошим решением с точки зрения производительности. Использование импорта ES6 напрямую без сборки - тоже не всегда хорошая идея. @import (импорт) CSS в CSS не всегда хорошая идея, но такая возможность есть.
Дайте знать, что вы думаете по этой теме статьи в комментариях. Мы крайне благодарны вам за ваши комментарии, дизлайки, отклики, подписки, лайки!
Пожалуйста, оставьте свои комментарии по текущей теме статьи. За комментарии, лайки, дизлайки, подписки, отклики огромное вам спасибо!
Функция разбирает HTML, содержащийся в строке source . В отличие от загрузки XML, HTML не должен быть правильно построенным (well-formed) документом. Эта функция также может быть вызвана статически для загрузки и создания объекта класса DOMDocument . Статический вызов может использоваться в случаях, когда нет необходимости устанавливать значения параметров объекта DOMDocument до загрузки документа.
Ошибки
Если через аргумент source передана пустая строка, будет сгенерировано предупреждение. Это предупреждение генерируется не libxml, поэтому оно не может быть обработано функциями обработки ошибок libxml.
До PHP 8.0.0 метод может вызываться статически, но вызовет ошибку E_DEPRECATED . Начиная с PHP 8.0.0, вызов этого метода статически выбрасывает исключение Error .
Несмотря на то, что некорректный HTML обычно успешно загружается, данная функция может генерировать ошибки уровня E_WARNING при обнаружении плохой разметки. Для обработки данных ошибок можно воспользоваться функциями обработки ошибок libxml.
Используем Gulp
Еще быстрее работает предварительная обработка подключения. У Gulp есть множество плагинов для этого. Один из них – gulp-file-include .
Посмотрите код ниже:
С помощью этого плагина можно передавать переменные в подключение, что позволяет создавать небольшие компоненты на основе данных.
Смотрите также
- DOMDocument::loadHTMLFile() - Загрузка HTML из файла
- DOMDocument::saveHTML() - Сохраняет документ из внутреннего представления в строку, используя форматирование HTML
- DOMDocument::saveHTMLFile() - Сохраняет документ из внутреннего представления в файл, используя форматирование HTML
Используем Grunt
Вот что делает плагин grunt-bake . Настройте Grunt для обработки HTML:
Тогда HTML сможет использовать специальный синтаксис для подключений:
Используем iframes
Используйте код, приведенный ниже:
Обратите внимание, что контент в iframes использует разные DOM. Поэтому код выглядит немного странно.
Но можно заставить iframe вывести свое содержимое на родительской странице, а затем удалить «самого себя».
Подключение JS-скриптов (файлы с расширением *.js) к сайту
JavaScript помогает нам во многих моментах повысить функциональность сайта. Будь то стилизация форм или, например, какая-нибудь техническая сторона вопроса.
Подключение JavaScript'а осуществляется двумя способами:
1. Первый – это непосредственно вставка кода в ваш сайт с помощью тегов:
2. Второй – с помощью файла:
Это удобно, если вы вдруг захотите сменить домен или перевести сайт на другой протокол.
Что касается места подключения, то все скрипты рекомендуется подключать в секции HEAD, перед закрывающим ее тегом. Например:
Их также можно подключить в секции BODY. Например, все библиотеки рекомендуется подключать в секции HEAD, тогда как все счетчики, слайдеры, галереи и прочие скрипты – в секции BODY, также перед закрывающим тегом.
Читайте также: