Манипулировать HTML из php - PullRequest
       42

Манипулировать HTML из php

5 голосов
/ 13 декабря 2010

У меня 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 parser или еще чего-нибудь? Поиск в Google дал мне эти термины, но я понятия не имею, что они на самом деле.

Ответы [ 3 ]

15 голосов
/ 13 декабря 2010

Вы можете использовать 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')] isn 't точно эквивалент CSS-селектора div.main ..., поскольку атрибут class может содержать более одного класса. Выполнение этого точно достаточно громоздко, я думаю, что лучше начать сУпрощенное выражение, когда вы знакомите людей с ним, даже если для тех, кто пойдет по этому пути, лучше всего узнать xpath достаточно хорошо, чтобы справиться с этим правильно, или просто используйте больше идентификаторов вместо классов. :)

1 голос
/ 13 декабря 2010

Если нужно просто включить статический фрагмент

<div class="main">
<?php readfile ('path/to/some/file'); ?>
</div>

Если необходимо включить вывод другого скрипта PHP

<div class="main">
<?php include ('path/to/some/file') ?>
</div>
1 голос
/ 13 декабря 2010

Вы читаете файл с:

$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 ...

...