Разбор HTML с phpQuery: как обрабатывать код C ++ внутри предварительного тега? - PullRequest
0 голосов
/ 23 августа 2011

В базе данных у меня есть некоторый код, подобный этому

<code>Some text
<pre>
#include <cstdio> 

int x = 1;
Некоторый текст

Когда я пытаюсь использовать phpQuery, чтобы выполнить синтаксический анализ, происходит сбой, потому что <cstdio>интерпретируется как тег.

Я мог бы использовать htmlspecialchars, но чтобы применить его только внутри тегов pre, мне все еще нужно провести некоторый анализ.Я мог бы использовать регулярные выражения, но это будет намного сложнее (мне нужно будет обработать возможные атрибуты тега pre), и идея использования парсера заключалась в том, чтобы избежать такого рода регулярных выражений.

Чтолучший способ сделать то, что мне нужно сделать?

Ответы [ 3 ]

0 голосов
/ 26 августа 2011

Я, наконец, пошел по пути регулярных выражений, рассматривая только простые атрибуты для тега pre (без '>' внутри атрибутов):

  foreach(array('pre', 'code') as $sTag)
     $s = preg_replace_callback("#\<($sTag)([^\>]*?)\>(.+?)\<\/$sTag\>#si",
     function($matches)
     {
        $matches[3] = str_replace(array('&amp;', '&lt;', '&gt;'), array('&', '<', '>'), $matches[3]);      
        return "<{$matches[1]} {$matches[2]}>".htmlentities($matches[3], ENT_COMPAT, "UTF-8")."</{$matches[1]}>";
     },
     $s);

Он также имеет дело с символами, уже преобразованными в html-сущности(мы не хотим иметь его дважды).

Не идеальное решение, но, учитывая данные, которые мне нужны для его применения, это сработает.

0 голосов
/ 26 августа 2011

Ошибка в том, что ваша база данных содержит HTML, который содержит некоторый текст, который уже неправильно закодирован.

Итак, если вы хотите сэкономить время и найти правильное решение, вам следует убедиться, что код HTML в вашей базе данных правильно закодирован. Это означает, что вы должны убедиться, что все будет правильно закодировано (используя htmlspecialchars()) , прежде чем оно будет сохранено в вашей базе данных !

В противном случае вы просто сохраняете мусор в своей базе данных, и вам нужно будет написать какой-то специальный код для «очистки этого мусора».

Любые другие решения - это обходные пути, и они будут стоить вам драгоценного времени в будущем.

Итак: лучшее решение - убедиться, что все, что вы пишете в свою базу данных, является правильным.

0 голосов
/ 23 августа 2011

Не забудьте выполнить кодирование HTML (&> и т. Д.) Перед сборкой

...