PHP.XPath.Вызов str_replace () вызывает ошибку «неопределенная сущность». - PullRequest
1 голос
/ 17 января 2012

Использование XPath для анализа этой ссылки

<code>$html = '<a href="/browse/product.do?cid=1&amp;vid=1&amp;pid=1" class="productItemName">what is going on here</a>';

$dom = new DOMDocument();
$dom->loadhtml($html);
$xpath = new DOMXPath($dom);

$selectors['link'] = '//a/@href';
$links_nodeList = $xpath->query($selectors['link']);

foreach ($links_nodeList as $link) {
    $link->nodeValue = str_replace("http://www.test.com",'',$link->nodeValue); // relativize link
    $links[] = $link->nodeValue;
}

echo("<p>links</p>");
echo("<pre>");
print_r($links);
echo("
");

дает результат:

Warning: main() [function.main]: unterminated entity reference vid=1&pid=1 in C:\Users\dir\public_html\whatisgoingon.php on line 14
links

Array
(
    [0] => /browse/product.do?cid=1
)

Эта строка вызывает ошибку и усечение ссылки. Что здесь происходит?

$link->nodeValue = str_replace("http://www.test.com",'',$link->nodeValue);

1 Ответ

2 голосов
/ 17 января 2012

&amp; внутри URL должен быть декодирован, когда вы ссылаетесь на nodeValue. Оберните это в htmlentities()

foreach ($links_nodeList as $link) {
    $link->nodeValue = str_replace("http://www.test.com",'',htmlspecialchars($link->nodeValue)); // relativize link
    $links[] = htmlspecialchars($link->nodeValue, ENT_QUOTES, 'UTF-8');
}

Выходы:

Array
(
    [0] => /browse/product.do?cid=1&amp;vid=1&amp;pid=1
)
...