#php #dom #html
#php #dom #HTML
Вопрос:
У меня есть встраиваемый код слайда, подобный приведенному ниже. весь этот HTML-код хранится в переменной $embed_code
.
Я печатаю этот код на PHP. Теперь я хочу фрагмент кода из этой HTML-строки.
Код написан ниже. Мне нужен код только между <object>
тегами.
$embed_code = '
<div style="width:425px" id="__ss_617490"><strong style="display:block;
margin:12px 0 4px"><a href="http://www.slideshare.net/al.capone/funny-beer-babies-
enginnering-rev-2-presentation" title="Funny beer babies enginnering rev.
2">Funny beer babies enginnering rev. 2</a></strong>
<object id="__sse617490"
width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com
/swf/ssplayer2.swf?doc=becoming-an-engineer-1222340701618958-9amp;stripped_title=funny-
beer-babies-enginnering-rev-2-presentationamp;userName=al.capone" /><param
name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/>
<embed name="__sse617490" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=
becoming-an-engineer-1222340701618958-9amp;stripped_title=funny-beer-babies-enginnering-
rev-2-presentationamp; userName=al.capone" type="application/x-shockwave-flash"
allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed>
</object>
<div style="padding:5px 0 12px">View more<a href="http://www.slideshare.net
/"> presentations</a> from <a href="http://www.slideshare.net/al.capone">
al.capone</a>.</div></div>';
Теперь я хочу, чтобы эта строка была только из <object id="....." to "</embed> </object>
всего этого HTML, генерируемого динамически, поэтому дайте мне любую идею для этого.
Как я могу это сделать? Существует ли какая-либо функция PHP, которая может извлекать html между любыми тегами?
Комментарии:
1. Вы можете использовать регулярное выражение или анализатор dom
2. @soju: Я бы 1 за предложение синтаксического анализатора dom, но нет способа -99999999 предложить регулярные выражения. Так что … 0 это так.
3. Что ж, в данном конкретном случае достаточно простого регулярного выражения
4. HTML-разметка и «простое регулярное выражение» являются взаимоисключающими терминами!
Ответ №1:
Используйте классы DOMDocument.
$dom = new DomdDocument ();
$dom -> loadHtml ($embed_code);
$htmlObject = $dom -> getElementById ('__sse617490'); // Returns a DomElement
Комментарии:
1. 1; phpQuery, который я упомянул в своем ответе, просто оборачивает это более приятным (на мой взгляд) API.
2. но я сказал, что этот html генерируется динамически, поэтому идентификатор div будет меняться при каждом новом слайде.
3. В этом случае вам нужен какой-то способ последовательной идентификации <object> для каждого слайда. Если <object> на странице является единственным тегом object, вы можете просто использовать getElementsByTagName(). Если нет, то вам нужно будет изменить код, который генерирует разметку, чтобы сделать объект отличным от всей остальной разметки на странице, возможно, путем добавления класса.
4. @rajzana Вы хотите
$dom->getElementByTagName('object');
. Смотрите: php.net/manual/en/domdocument.getelementsbytagname.php5. @GordonM Похоже, что он удаляет Slideshare, поэтому я не думаю, что он может изменить разметку.
Ответ №2:
Мне нравится использовать phpQuery для синтаксического анализа и извлечения данных из HTML с помощью PHP. Для обхода кода используются простые селекторы стиля jQuerys CSS.
Таким образом, это было бы:
require('phpQuery/phpQuery.php');
$doc = phpQuery::newDocumentHTML($embed_code);
$div = pq('div#__ss_617490'); // select a DIV with the specified ID
var_dump($div->attr('style')); //To get the style attribute
var_dump($div->html()); // To get the inner html
// now to get the object tag like you desire.
$object_tag = pq('object');
// only get the first object
$object_tag = pq('object:first');
Ответ №3:
Вы могли бы просто использовать регулярное выражение для его разбора и извлечения:
$embed_code = "blah blah <object ...>and other code here</object> blah blah";
$matches = array();
preg_match('#<object(s*[^>])?>(.*)</object>#iU', $embed_code, $matches);
// $matches[0] = "<object ...>and other code here</object>"
// $matches[1] = "and other code here"
Комментарии:
1. Как обсуждалось @MarcB 8 минут назад, регулярное выражение не является лучшим или самым чистым решением проблемы синтаксического анализа HTML.
2. @Treffynnon Это зависит от контекста — иногда создание целой структуры DOM в памяти только для извлечения части текста, который она содержит, является излишеством, и регулярное выражение более эффективно.
3. Ясность имеет большее значение. Память дешевая. Время, потраченное впустую на отладку кода, дорого.
4. При некоторых обстоятельствах память может иметь важное значение. А как насчет времени обработки? Иногда регулярное выражение будет быстрее, чем анализатор DOM. Опять же, все сводится к контексту и таким соображениям, как уровень контроля над вводом (генерируемый пользователем / системой, всегда правильно сформированный?) следует учитывать. Следовательно, почему в моем сообщении говорится «мог», а не «должен».
5. Чтобы было ясно, я не отклонял этот ответ. Кто-то другой должен чувствовать себя еще сильнее, чем я!