2015-04-04 1 views
1

Благодаря потребностям пользовательских хранилищ («почему» не важно здесь, спасибо!) Я должен сохранить HTML <a> ссылки в определенном формате, как это:Как я могу предотвратить html-объекты с PHP DOMDocument :: saveHTML()?

myDOMNode->setAttribute("href", "{{{123456}}}"); 

Все отлично работает, пока я не позову saveHTML() на содержащий DOMDocument. Это убивает его, так как он кодирует { в %7B.

Это устаревшее приложение, в котором href = "{{{123456}}}" работает как заполнитель. Парсер синтаксического анализа ищет этот шаблон точно (unencoded) и не может быть изменен.

У меня нет выбора, кроме как сделать это таким образом.

Я не могу получить htmldecode() результат.

Этот HTML-код никогда не будет отображаться как это, это просто необходимость хранения.

Благодарим за помощь!

Примечание: Я огляделся в течение 2 часов, но ни одно из предлагаемого решения не работало для меня. Для тех, кто будет слепо отмечать вопрос как дубликат: прокомментируйте и дайте мне знать.

+0

Действительно это закодировать его. Но это не объясняет, что вы подразумеваете под «это убивает». Это URL, они могут быть закодированы, без проблем. Просто чтобы вы могли видеть, что я не шучу, я привел пример: http://www.ergobase.nl/test25.html. Посмотрите исходный код, он закодирован, нажмите ссылку, он работает! Вау. Поэтому, пожалуйста, скажите мне, что вы подразумеваете под «это убивает»? –

+0

Вы правы, ссылка будет работать, но это устаревшее приложение, где href = "{{{123456}}}" работает как заполнитель. Парсер синтаксического анализа ищет этот шаблон точно (unencoded) и не может быть изменен. –

+0

Что произойдет, если вы используете 'html_entity_decode()' после 'saveHTML()' и перед тем, как отправить его в синтаксический анализатор командной строки? –

ответ

2

Как устаревший код использует {{{...}}} в качестве заполнителя, может быть безопасным использовать несколько хакерский подход с preg_replace_callback. Ниже будет восстановить URL закодирован заполнители, как только HTML генерируется:

$src = <<<EOS 
<html> 
    <body> 
     <a href="foo">Bar</a> 
    </body> 
</html> 
EOS; 

// Create DOM document 
$dom = new DOMDocument(); 
$dom->loadHTML($src); 

// Alter `href` attribute of anchor 
$a = $dom->getElementsByTagName('a') 
    ->item(0) 
    ->setAttribute('href', '{{{123456}}}'); 

// Callback function to URL decode match 
$urldecode = function ($matches) { 
    return urldecode($matches[0]); 
}; 

// Turn DOMDocument into HTML string, then restore/urldecode placeholders 
$html = preg_replace_callback(
    '/' . urlencode('{{{') . '\d+' . urlEncode('}}}') . '/', 
    $urldecode, 
    $dom->saveHTML() 
); 

echo $html, PHP_EOL; 

Output (с отступом для ясности):

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html> 
    <body> 
     <a href="{{{123456}}}">Bar</a> 
    </body> 
</html>