Как я могу обработать грязный HTML и извлечь URL, используя Xpath (или другой процесс)? - PullRequest
2 голосов
/ 18 ноября 2011

Итак, я работаю с Wordpress 3.x и пытаюсь создать собственное отображение контента, уже хранящегося в базе данных WP MySQL. Мне нужно проанализировать содержимое поста WP по URL-адресу mp3 в каждом, чтобы я мог использовать его в другом месте своего кода. В Wordpress есть встроенная функция get_the_content (), которая захватывает данные содержимого публикации для использования в моем коде.

Я думаю, что сократил свой код буквально до 2 строк (я пытаюсь быть максимально эффективным, так как весь этот код появляется в цикле while) плюс оператор echo для отображения данных, захваченных в массиве, созданном xpath. Кажется, проблема в том, что я продолжаю получать Неустранимая ошибка PHP: вызов функции-члена xpath () для необъектного , и вызов echo не возвращает результатов. Первая ошибка отображается в шорткоде [be-link-title-info], а затем снова с URL-адресом MP3 из ссылки.

Это заставляет меня думать, что содержание поста "грязное". Amazon Cloud вставляет «+» для каждого пробела, когда файлы загружаются, и я не могу рассчитывать на имена файлов, в которых нет пробелов, так как у меня есть команда людей, загружающая контент, поэтому я хочу иметь в виду тот факт, что некоторые могут загружать файлы с именами, которые содержат пробелы (которые впоследствии преобразуются в символы +)

Как уже упоминалось, эта ошибка возникает с шорткодом, а также с href, который я ищу, что может быть связано с использованием специальных символов? Все, что мне нужно, это MP3 URl в href и ничего более. Как я могу очистить эти данные, чтобы они правильно анализировались (если это на самом деле проблема)? Или, может быть, устранить все, что анализируется, кроме тега и его атрибута? Может кто-нибудь дать мне совет, что я делаю неправильно, пожалуйста?

Это пример того, как выглядит каждое сообщение с точки зрения формата и содержания (именно это возвращает функция get_the_content ()):

<img class="myclass" title="mytitle" src="http://www.mydomain.com/myfolder/mypic.jpg" alt="myalt" width="552" height="414" />

[be-linked-title-info]

<a title="mytitle" href="https://s3.amazonaws.com/myfolder/published/RJD2+-+SEVEN+LIGHT+YEARS+(INSTRUMENTAL).mp3">Song Name and Artist</a>

The written plain text post entry describing this music track goes here and says blah blah blah

Я использую код, который возвращает ошибку:

$xml  = simplexml_load_string(get_the_content());
$list = $xml->xpath("//a[contains(@href,'mp3')]/@href");

И позже я хочу использовать это, чтобы вернуть URL, захваченный из href:

<?php $list[0]; ?>

Ответы [ 2 ]

2 голосов
/ 18 ноября 2011

Очевидно, что контент не всегда является правильно сформированным XML. Попробуйте этот метод вместо.

// before the loop
$doc   = new DOMDocument();
$doc->strictErrorChecking = FALSE;

$xpath = new DOMXpath($doc);

// in the loop
$success = $doc->loadHTML(get_the_content());
if ($success === FALSE) {
  // error handling
} else {
  $hrefs = $xpath->query("//a[contains(@href,'mp3')]/@href");
  foreach ($hrefs as $href) {
    // whatever
  }
}

Чтобы сделать это более эффективным, просто объедините все тела статей, прежде чем создавать из них DOMDocument. Таким образом вы получите штраф за создание / уничтожение документа и запрос XPath только один раз.

0 голосов
/ 21 ноября 2011

Кажется, это гораздо более эффективный способ, не так ли?

// Get web address
$domQuery = query_HtmlDocument($html, '//a');

foreach($domQuery as $rtn) {
$web = $rtn->getAttribute('href');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...