2010-08-07 19 views
10

हाय मुझे कुछ एक्सएमएल मिला है जो मान्य नहीं होगा। मैं इस बिट के लिए समस्या को संकुचित होता है:प्रमाणीकरण विफल: "EntityRef: उम्मीद कर रहा है; '"

<script type="text/javascript">document.getelementbyid("oxm-1f4a4485-5a1d-45f9-a989-9c65a0b9ceb6").src="http://bid.website.net/display?l=h4siaaaaaaaaad2nmq6cqbrenycw7qjyolfccxmregvcoae0u0sly_agtvaewwn4bg_havwbnebpvmzkkzra_kzzdvoloq4u-hjnp7sii0rxcbzz5vl5kxsrds6wtsfbxmcr9chysuhqbecuckb8cvx4m-pbcxugtdrll6d3dqtihnqukth2yvdkptr67cuzfvlxjlinkul9634lpal_h4mwhso8aabzhw1cdcwjxl6xivgv8agrjxjc_gaaaa==&p=h4siaaaaaaaaabxkmq7cmaxaurcqjjrrsfqqsrm7x3fsrwyvosda8qnj_3ojfgb49o45pblq7e80syzjhopggso9wyzpcpntzkxk1ldtbbi7otmxfj9da1wpjcf10vtxdj9e5_utyj19k2lfssepld5agnqaaaa=&url=http%3a%2f%2flocalhost%2fproject-debug%2fproject.html";</script> 

मैं एक एक्सएमएल सत्यापनकर्ता में रख और इसे बाहर थूका: स्तंभ पर पंक्ति 1 पर त्रुटि:

यह पृष्ठ निम्नलिखित त्रुटियाँ हैं 16: EntityRef: ';' की अपेक्षा

कोई विचार जहां लापता ';' जाना जाता है? क्या कोई और समस्या है?

उत्तर

25

आपके पास अपने यूआरएल में & से बच निकले हैं। उन्हें या तो (ए) चरित्र इकाइयों में बदलना होगा (&amp;), या (बी) एक सीडीएटीए अनुभाग में संलग्न है।

<script type="text/javascript"> 
// <![CDATA[ 
    document.getElementById(...).src="..."; 
// ]]> 
</script> 

तुम कुछ भी आप सटीक चरित्र अनुक्रम ]]> से अलग एक CDATA खंड के अंदर चाहते शामिल कर सकते हैं:

एक CDATA अनुभाग ताकि सबसे आसान हो जाएगा, तो आप & नहीं छोड़ा जाएगा जैसे विशेष वर्ण छोड़ देता है। // टिप्पणियां यह सुनिश्चित करने के लिए हैं कि सीडीएटीए अनुभागों को समझने वाले ब्राउज़र <![CDATA[ और ]]> मार्करों को अनदेखा करते हैं।

वैसे, जावास्क्रिप्ट केस संवेदनशील है। यह getElementByIdgetelementbyid होना चाहिए।

1

सामग्री को संशोधित करना हमेशा संभव नहीं होता है, उदाहरण के लिए यदि आप किसी वेबसाइट को स्क्रैप कर रहे हैं।

आप '&' के साथ ' amp' के साथ str_replace नहीं कर सकते हैं ' क्योंकि एचटीएमएल में वैध एचटीएमएल इकाइयां शामिल हो सकती हैं, और आपको कुछ ऐसा मिलेगा जैसे "& amp; amp;"

यहाँ एक regex जो ऐम्परसेंड के लिए htmlentiries साथ ऐम्परसेंड बदलना चाहिए है, अच्छा htmlentities को तोड़ने के बिना: बिना किसी समस्या के

$html = preg_replace("|&([^;]+?)[\s<&]|","&amp;$1 ",$html); 

मैं इसे इस्तेमाल किया लगभग 700 पृष्ठों स्क्रैप करने का :)