كيفية تحديد ما إذا كانت علامة 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 مع regexps. أبداً تحليل HTML مع مقارنات السلسلة. دائماً استخدم محلل HTML لتحليل HTML - وهذا هو الغرض من وجودهم.

لقد مر وقت طويل منذ أن قمت بأي PHP، ولكن ظهر بحث سريع محلل PHP5 HTML هذا.

لا تكتب محللًا، استخدم محللًا آخر: DOMDocument::loadHTML - هذا واحد فقط، وأعتقد أن هناك الكثير من الآخرين.

حسنًا، هذا لا يجيب على السؤال وهو مجرد رأي، ولكن...

أعتقد أن أفضل استراتيجية لاستخراج البيانات (وبالتالي القضاء على هذه المشكلة) لا تتمثل في تحليل سطر HTML سطرًا تلو الآخر، وهو أمر غير طبيعي بالنسبة لـ HTML، ولكن تحليله باستخدام محدده الطبيعي:<> أزواج.

سيكون هناك نوعين بالطبع:

  • عناصر العلامة التي يتم إغلاقها على الفور، على سبيل المثال، <br ​​/>
  • عناصر العلامة التي تحتاج إلى علامة إغلاق منفصلة، ​​على سبيل المثال، < p > text </p >

يمكنك أن ترى على الفور ميزة استخدام هذه الإستراتيجية في حالة علامات الفقرة (ع):سيكون من الأسهل تحليل الفقرات المتعددة بدلاً من الاضطرار إلى تتبع مكان علامة الإغلاق.

لماذا لا تقرأ في سطر، وتضبطه على سلسلة، ثم تتحقق من السلسلة بحثًا عن فتحات العلامات وإغلاقها، إذا كانت العلامة تمتد أكثر من سطر واحد، أضف السطر التالي إلى السلسلة وحرك الجزء قبل قوس الفتح إلى السلسلة التي تمت معالجتها.ثم قم فقط بتحليل الملف بأكمله للقيام بذلك.انها ليست جميلة ولكن يجب أن تعمل.

إذا كان عليك الالتزام بأسلوبك الحالي في التحليل، وكان عبارة عن تعبير عادي، فيمكنك استخدام علم متعدد الخطوط "m" لتمتد عبر خطوط متعددة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top