Как сделать файл XHTML действительным с помощью регулярных выражений - PullRequest
1 голос
/ 15 февраля 2011

Я пытаюсь использовать PHP с SimpleXML для синтаксического анализа файла XHTML, однако файл содержит знаки <и>, которые не являются частью разметки и вызывают сбой анализа (несоответствие открывающего и конечного тегов).

Как я могу преобразовать их в HTML-объекты перед анализом, не изменяя файл или не влияя на разметку?

Пример:

<p> a < b </p>

Будет:

<p> a &lt; <b> </p>

Ответы [ 2 ]

2 голосов
/ 15 февраля 2011

Ну, краткий ответ: вы не можете разобрать html с регулярным выражением.

Может быть, вы могли бы попробовать использовать другой xml-анализатор, который не давится < и >?

Еще лучше, не пытайтесь анализировать xhtml-файл как xml, поскольку, как вы уже указали, это не действительно xml-файл, в котором есть недопустимые символы.

1 голос
/ 15 февраля 2011

Как уже сказал Мартин Йесперсен, не существует хорошего способа анализа (недействительной или действительной) разметки с помощью регулярных выражений, по крайней мере, с помощью регулярных выражений PHP.

Тем не менее, если вы только ищете способ удалить

  • несбалансированные угловые скобки
  • между допустимыми тегами
  • , которые не содержат угловых скобок где-то внутри значений их атрибутов

тогда вам может это сойти с рук:

$intermediate = preg_replace('/(>[^<>]*)<([^<>]*<)/', '\1&lt;\2', $subject);
$result = preg_replace('/(>[^<>]*)>([^<>]*<)/', '\1&gt;\2', $intermediate);

но вам придется запускать это несколько раз, пока не останется больше совпадений, потому что это поймает только одну паузу < или > между тегами за раз. Также произойдет сбой в псевдосбалансированных скобках, таких как <p> a <> b </p>.

...