سؤال

أواجه حاليًا مشكلة حيث يعود أحد العناصر من ملف xml الخاص بي مع وجود علامة اقتباس واحدة فيه.يؤدي هذا إلى تقسيم xml_parse إلى أجزاء متعددة، على سبيل المثال:احصل على Wired، لقد تم تعيينك!ثم يتم تفسيره على أنه "الحصول على سلكية ، أنت" كائن واحد ، الاقتباس الفردي كونه ثانية ، و "إعادة تعيين!" كثالث.

ما أريد القيام به هو:

while($data = fread($fp, 4096)){
        if(!xml_parse($xml_parser, htmlentities($data,ENT_QUOTES), feof($fp))) {
            break;
        }
    }

لكن هذا يستمر في الانهيار.يمكنني تشغيل str_replace بدلاً من htmlentities ويتم تشغيله بدون مشكلة، لكنه لا يريد ذلك مع htmlentities.

أيه أفكار؟

تحديث:وفقًا لرد JimmyJ أدناه، لقد حاولت الحل التالي دون أن يحالفني الحظ (لمعلوماتك، يوجد رد أو ردان فوق المنشور المرتبط الذي يقوم بتحديث الكود المرتبط مباشرة):

function XMLEntities($string)
    {
        $string = preg_replace('/[^\x09\x0A\x0D\x20-\x7F]/e', '_privateXMLEntities("$0")', $string);
        return $string;
    }

    function _privateXMLEntities($num)
    {
    $chars = array(
        39  => ''',
        128 => '€',
        130 => '‚',
        131 => 'ƒ',
        132 => '„',
        133 => '…',
        134 => '†',
        135 => '‡',
        136 => 'ˆ',
        137 => '‰',
        138 => 'Š',
        139 => '‹',
        140 => 'Œ',
        142 => 'Ž',
        145 => '‘',
        146 => '’',
        147 => '“',
        148 => '”',
        149 => '•',
        150 => '–',
        151 => '—',
        152 => '˜',
        153 => '™',
        154 => 'š',
        155 => '›',
        156 => 'œ',
        158 => 'ž',
        159 => 'Ÿ');
        $num = ord($num);
        return (($num > 127 && $num < 160) ? $chars[$num] : "&#".$num.";" );
    }
if(!xml_parse($xml_parser, XMLEntities($data), feof($fp))) {
            break;
        }

تحديث: وفقًا لسؤال توم أدناه، تم إيقاف الاقتباسات السحرية بالفعل.

حل: ما انتهى بي الأمر إلى حل المشكلة هو ما يلي:

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

لذا، إذا انتهى بي الأمر بثلاثة أجزاء (كما هو مذكور أعلاه، دعنا نلتزم بـ "Get Wired، You're Hired!")، فسوف أنتقل بعد ذلك من القيام بذلك

$x = 'Get Wired, You'
$x = "'"
$x = 're Hired!'

للقيام ب:

$x = 'Get Wired, You' . "'" . 're Hired!'

هذا ليس الحل الأمثل، ولكن يبدو أنه يعمل.

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

المحلول

لماذا لا تستخدم شيئًا مثل simplexml_load_file لتحليل ملفك بسهولة؟

نصائح أخرى

أعتقد أن تمكين علامات الاقتباس السحرية يمكن أن يفسد تحليل XML في بعض الأحيان - هل هذا ممكن؟.يمكنك تعطيل هذا في وقت التشغيل باستخدام

set_magic_quotes_runtime(0);

يحرر:قد لا يكون هذا ذا صلة إذا لم يتم نشر المصدر أو الحصول عليه، لكنني قرأت في دليل PHP أنه قد يتسبب في سلوك غريب على أي حال

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