Хорошо, я собираюсь пойти с DOMXpath на этом.Я не уверен, что подразумевается под «внешним текстом», но я пойду с этим требованием:
Как если бы span-profile = «правильное имя», тогда потяните его div-msgbody
Прежде всего, вот миниатюрный тестовый пример HTML, который я использовал:
<html>
<body>
<div class="thread" style="margin-bottom:25px;">
<div class="message">
<span class="profile">Suzy Creamcheese</span>
<span class="time">December 22, 2010 at 11:10 pm</span>
<div class="msgbody">
<div class="subject">New digs</div>
Hello thank you for trying our soap. <BR> Jim.
</div>
</div>
<div class="message reply">
<span class="profile">Lars Jörgenmeier</span>
<span class="time">December 22, 2010 at 11:45 pm</span>
<div class="msgbody">
I never sold you any soap.
</div>
</div>
</div>
</body>
</html>
Итак, мы сделаем запрос XPath для этого.Давайте покажем все это, а затем разобьем его:
$messages = $xpath->query("//span[@class='profile' and contains(.,'$profile_name')]/../div[@class='msgbody']");
Разбивка:
// span
Дайте мне промежутки
// span [@ class = 'profile']
Дайте мне промежутки, где класс является профилем
// span [@ class = 'profile' и содержит (., '$ profile_name')]
Дайте мне промежутки, где класс является профилем, а внутренняя часть промежутка содержит $profile_name
, то есть имя, которое вы после
// span [@ class ='profile 'и содержит (.,' $ profile_name ')] /../
Дайте мне промежутки, где класс является профилем, а внутренняя часть промежутка содержит $profile_name
, то есть имя, которое вы ищетеТеперь поднимитесь на уровень, который приведет нас к <div
class="message">
// span [@ class = 'profile' 'и содержит (.,' $ profile_name ')] /../ div [@ class ='msgbody ']
Дайте мне промежутки, где класс является профилем, а внутренняя часть промежутка содержит $profile_name
, то есть имя, за которым вы теперь идете, поднимитесь на уровень, что приведет нас к <div
class="message">
инаконец, дайте мне все div в <div class="message">
, где класс msgbody
Теперь вот пример кода PHP:
$doc = new DOMDocument();
$doc->loadHTMLFile("test.html");
$xpath = new DOMXpath($doc);
$profile_name = 'Lars Jörgenmeier';
$messages = $xpath->query("//span[@class='profile' and contains(.,'$profile_name')]/../div[@class='msgbody']");
foreach ($messages as $message) {
echo trim("{$message->nodeValue}") . "\n";
}
XPath очень мощный, как этот.Я рекомендую просмотреть базовый учебник , затем вы можете проверить стандарт XPath , если хотите увидеть более расширенное использование.