لماذا تعود هذه الأخطاء التي تعود إلى regex عندما أستخدمها لصيد IMG SRC من HTML؟

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

سؤال

أنا أكتب وظيفة تصطاد SRC من علامة الصورة الأولى التي يجدها في ملف HTML. باتباع التعليمات في هذا الموضوع هنا ، حصلت على شيء يبدو أنه يعمل:

preg_match_all('#<img[^>]*>#i', $content, $match); 

foreach ($match as $value) {
    $img = $value[0];
                           } 

$stuff = simplexml_load_string($img);
$stuff = $stuff[src];
return $stuff;

ولكن بعد بضع دقائق من استخدام الوظيفة ، بدأت في إرجاع أخطاء مثل هذه:

تحذير: simplexml_load_string () [0function.simplexml-load-string0]: الكيان: السطر 1: خطأ محلل: نهاية البيانات المبكرة في سطر العلامة IMG 1 في المسار/إلى/البرنامج النصي في السطر 42.

و

تحذير: simplexml_load_string () [0function.simplexml-load-string0]: tp: //feeds.feedburner.com/~f/chicagobusinesscombreakingnews؟

أنا جديد نوعًا ما على PHP ، لكن يبدو أن regex يقطع HTML بشكل غير صحيح. كيف يمكنني جعلها أكثر "محكمة الإغلاق"؟

هل كانت مفيدة؟

المحلول

يجب أن يمنحك هذان السطران من رمز PHP قائمة بجميع قيم سمة SRC في جميع علامات IMG في ملف HTML:

preg_match_all('/<img\s+[^<>]*src=["\']?([^"\'<>\s]+)["\']?/i', $content, $result, PREG_PATTERN_ORDER);
$result = $result[1];

للحفاظ على REGEX بسيطًا ، لا أسمح لأسماء الملفات بمساحات فيها. إذا كنت ترغب في السماح بذلك ، فأنت بحاجة إلى استخدام بدائل منفصلة لقيم السمات المقتبسة (والتي يمكن أن تحتوي على مسافات) ، وقيم السمات غير المخصصة (التي لا يمكن أن تحتوي على مسافات).

نصائح أخرى

على الأرجح لأن "XML" التي يتم التقاطها بواسطة Regex ليست XML مناسبة لأي سبب من الأسباب. من المحتمل أن أذهب إلى إعادة تجميع أكثر تعقيدًا من شأنها سحب سمة SRC ، بدلاً من استخدام SimpleXML للحصول على SRC. قد يكون هذا Regex قريبًا مما تحتاجه.

<img[^>]*src\s*=\s*['|"]?([^>]*?)['|"]?[^>]*>

يمكنك أيضًا استخدام مكتبة تحليل HTML حقيقية ، لكنني لست متأكدًا من الخيارات الموجودة في PHP.

Ampersand من تلقاء نفسه في سمة غير صالحة XML (يجب ترميزها على أنها "&") ، لكن بعض الأشخاص ما زالوا يضعونه على هذا النحو على عناوين URL على صفحات HTML (وجميع المتصفحات تدعمها). ربما تكمن مشكلتك.

إذا كان هذا هو الحال ، فيمكنك تطهير السلسلة الخاصة بك قبل تحليلها ، واستبدالها "&(?!amp;)" بواسطة "&amp;”.

في موضوع مختلف:

foreach ($match as $value) {
    $img = $value[0];
                           } 

يمكن استبداله بـ

$img = $match[count($match) - 1][0];

شيء من هذا القبيل:

if (preg_match('#<img\s[^>]*>#i', $content, $match)) {
    $img = $match[0]; //first image in file only
    $stuff = simplexml_load_string($img);
    $stuff = $stuff[src];
    return $stuff;
} else {
    return null; //no match found
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top