Как определить, разбивается ли тег HTML на несколько строк

StackOverflow https://stackoverflow.com/questions/33814

  •  09-06-2019
  •  | 
  •  

Вопрос

Я пишу PHP-скрипт, который включает в себя очистку веб-страниц.В настоящее время скрипт анализирует страницу построчно, но он прерывается, если есть тег, охватывающий несколько строк, например

<img src="example.jpg"
alt="example">

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

В идеале я мог бы обнаружить тег, охватывающий строки, соединить их со строками и продолжить обработку.
Так какой же лучший способ это обнаружить?

Это было полезно?

Решение 4

Возможно, для будущих проектов я буду использовать библиотеку синтаксического анализа, но это как бы вопрос, о котором идет речь. Это мое текущее решение. rstrpos это strpos, но в обратном направлении. Пример использования:

for($i=0; $i<count($lines); $i++)
{
    $line = handle_mulitline_tags(&$i, $line, $lines);
}

И вот эта реализация:

function rstrpos($string, $charToFind, $relativePos)
{
    $searchPos = $relativePos;
    $searchChar = '';

    while (($searchChar != $charToFind)&&($searchPos>-1))
    {
        $newPos = $searchPos-1;
        $searchChar = substr($string,$newPos,strlen($charToFind));
        $searchPos = $newPos;
    }

    if (!empty($searchChar))
    {
        return $searchPos;
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

function handle_multiline_tags(&$i, $line, $lines)
{
    //if a tag is opened but not closed before a line break,

    $open = rstrpos($line, '<', strlen($line));
    $close = rstrpos($line, '>', strlen($line));
    if(($open > $close)&&($open > -1)&&($close > -1))
    {
        $i++;
        return trim($line).trim(handle_multiline_tags(&$i, $lines[$i], $lines));
    }
    else
    {
        return trim($line);
    }
}

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

Другие советы

Это одна из моих любимых мозолей: никогда анализировать HTML вручную. Никогда анализировать HTML с помощью регулярных выражений. Никогда анализировать HTML с помощью сравнения строк. Всегда используйте анализатор HTML для анализа HTML & nbsp; & # 8211; вот для чего они там.

Прошло много времени с тех пор, как я написал какой-либо PHP, но появился быстрый поиск этот анализатор PHP5 HTML .

Не пишите парсер, используйте чужие: DOMDocument :: loadHTML - это всего лишь один, я думаю, что есть много других.

Ну, это не ответ на вопрос, а скорее мнение, но...

Я думаю, что лучшая стратегия парсинга (и, следовательно, устранения этой проблемы) — не анализировать HTML построчно, что неестественно для HTML, а анализировать его по его естественному разделителю:<> пары.

Курс будет двух типов:

  • Тегируйте элементы, которые сразу закрываются, например, < br />
  • Элементы тегов, которым нужен отдельный закрывающий тег, например, <p> text</p>

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

Почему бы вам не прочитать строку и установить ее в строку, а затем проверить строку на наличие открытий и закрытий тегов. Если тег занимает более одной строки, добавьте следующую строку в строку и переместите часть перед открывающая скобка для вашей обработанной строки. Затем просто проанализируйте весь файл, делая это. Это не красиво, но это должно работать.

Если вам нужно придерживаться текущего метода синтаксического анализа, и это регулярное выражение, вы можете использовать многострочный флаг " m " чтобы охватить несколько строк.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top