У меня есть html-файл, index.php
Я хочу взять содержимое в <div>
с main
классом этого файла и заменить его другим текстом. Как я могу это достичь?
Пример содержимого в html:
<div class="main"> Replace this text with some code! </div>
Я хочу получить содержимое в этом div с помощью php и заменить его другим контентом. Но я не знаю, как это сделать.
Обновление: я знаю, что клиентский трюк с javascript. Я хочу сделать эту серверную часть. И файл будет html, а не php. поэтому я думаю, что мне нужно открыть html в php и сделать это, хотя я точно не знаю.
Можно ли это сделать с помощью парсера xpath или html dom или что-то еще? Поиск Google дал мне эти условия, но я понятия не имею, что они на самом деле.
Для этого вы можете использовать классы / функции PHP DOM .
Начните с создания / загрузки документа:
$d = new DOMDocument(); $d->loadHTML($yourWellFormedHTMLString);
Затем вам захочется найти узел документа, который вы хотите изменить. Вы можете сделать это с помощью XPath:
$xpathsearch = new DOMXPath($d); $nodes = $xpathsearch->query('//div[contains(@class,'main')]');
Затем вы захотите перебрать соответствующие узлы и создать новые узлы внутри:
foreach($nodes as $node) { $newnode = $d->createDocumentFragment(); $newnode->appendXML($yourCodeYouWantToFillIn); $node->appendChild($newnode); }
Если вы не против возиться с библиотекой на ранней стадии разработки, взгляните на CAST (шаблоны стилей, ориентированные на контент). Это в значительной степени предназначено для того, чтобы делать то, что вы описываете, и, если ничего другого, вы могли бы заглянуть внутрь источника, чтобы увидеть примеры.
(ПРИМЕЧАНИЕ. Я уверен, что проницательный заметит, что //div[contains(@class,'main')]
не является точно эквивалентом селектора CSS div.main
… поскольку атрибут класса может содержать больше, чем один класс. Выполнение этого точно достаточно громоздко, я думаю, что лучше начать с упрощенного выражения, когда вы вводите в него людей, даже если это может быть лучше для тех, кто идет по этому маршруту, чтобы в конечном итоге узнать xpath достаточно хорошо, чтобы справиться с этим или просто используйте ids больше вместо классов. 🙂
Если нужно просто включить статический фрагмент
<div class="main"> <?php readfile ('path/to/some/file'); ?> </div>
Если ему нужно включить вывод другого скрипта PHP
<div class="main"> <?php include ('path/to/some/file') ?> </div>
Вы читаете файл:
$fileContents=file_get_contents($file_path);
http://php.net/manual/en/function.file-get-contents.php
Затем вы выполняете поиск и замену содержимого div:
$newHtmlContent=preg_replace("/<div class=\"main\">(.*)</div>/i",'<div class="main">Some text here</div>',$fileContents);
http://php.net/manual/en/function.preg-replace.php
Мое регулярное выражение немного ржавое, но вы можете его зачерпнуть здесь: http://www.regular-expressions.info/tutorial.html
Затем сохраните новый контент:
file_put_contents($file_path,$newHtmlContent);
http://www.php.net/manual/en/function.file-put-contents.php
Или вы можете проанализировать файл, используя это: http://simplehtmldom.sourceforge.net/ Но он должен быть хорошо сформирован.
Я бы порекомендовал эту версию, потому что вышеописанное не сработает, если основной элемент div – другой div …