आपका परिदृश्य कई किनारे मामलों और शब्द चाहिए शीर्ष पर जोड़ रहा है है। मुझे लगता है कि आप क्लासिक करना चाहते हैं, एक डबल ब्रेक एक नया अनुच्छेद चीज शुरू करता है, हालांकि इस बार माता-पिता <div>
(या निश्चित रूप से अन्य ब्लॉक तत्व) के भीतर भी।
मैं एचटीएमएल पार्सर को अधिकांश काम करने देता हूं लेकिन मैं अभी भी टेक्स्ट सर्च के साथ काम करता हूं और प्रतिस्थापित करता हूं (xpath के बगल में)। तो आप जो कुछ देखेंगे वह थोड़ा हैकिश है लेकिन मुझे लगता है कि बहुत स्थिर है:
सबसे पहले मैं सभी टेक्स्ट-नोड्स का चयन करूंगा जो शीर्ष स्तर के या निम्न div के बच्चे हैं।
(.|./div)/text()
यह xpath एक लंगर तत्व है जो <body>
टैग है जब DOMDocument
में लोड के रूप में यह अपने HTML टुकड़ा की जड़-टैग का प्रतिनिधित्व करता है के सापेक्ष है।
यदि एक div के बच्चे तो मैं शुरुआत में शुरुआती पैराग्राफ डाल दूंगा।
फिर किसी भी मामले में मैं एक अनुक्रम की प्रत्येक घटना पर एक ब्रेक-मार्क (यहां टिप्पणी के रूप में) डालता हूं जो एक नया पैराग्राफ शुरू करता है (जो "\n\n"
होना चाहिए क्योंकि व्हाइटसाइट सामान्यीकरण के कारण, मैं गलत हो सकता हूं और यदि यह लागू नहीं होता है, आपको यह काम पारदर्शी रूप से करने के लिए व्हाइटसाइट-सामान्यीकरण को आगे बढ़ाने की आवश्यकता होगी)।
/* @var $result DOMText[] */
$result = $xp->query('(.|./div)/text()', $anchor);
foreach ($result as $i => $node)
{
if ($node->parentNode->tagName == 'div')
{
$insertBreakMarkBefore($node, true);
}
while (FALSE !== $pos = strpos($node->data, $paragraphSequence))
{
$node = $node->splitText($pos + $paragraphSequenceLength);
$insertBreakMarkBefore($node);
}
}
इन डाला तोड़ने के निशान अभी देखते हैं एक HTML <p>
टैग के साथ बदला जाएगा। एक HTML पार्सर उन्हें <p>...</p>
जोड़े में बदल देगा ताकि मैं खुद को उस एल्गोरिदम लिख सकूं (भले ही यह दिलचस्प हो)। यह मूल रूप से काम की तरह मैं एक बार कुछ अन्य जवाब में बताया गया है, लेकिन मैं सिर्फ लिंक किसी भी अब नहीं मिल रहा है:
- डोम पेड़ के संशोधन के बाद, फिर से
<body>
की innter एचटीएमएल मिलता है।
"<p>"
साथ सेट अंक बदलें (यहाँ मैं वर्ग के रूप में अच्छी तरह से निशान इस दृश्यमान बनाने के लिए) उचित <p>...</p>
जोड़े के साथ डोम फिर से बनाने के लिए फिर से पार्सर में HTML टुकड़ा
- लोड।
- एचटीएमएल को फिर से
DOMDocument
पार्सर से प्राप्त करें, जो अब अंत में है।
कोड में इन उल्लिखित चरणों (एक पल के लिए समारोह परिभाषा के कुछ लंघन):
$needle = sprintf('%1$s<!--%2$s-->%1$s', $paragraphSequence, $paragraphComment);
$replace = sprintf("\n<p class=\"%s\">\n", $paragraphComment);
$html = strtr($innerHTML($anchor), array($needle . $needle => $replace, $needle => $replace));
echo "HTML afterwards:\n", $innerHTML($loadHTMLFragment($html));
इस शो के रूप में, डबल दृश्यों को एक साथ बदल दिए जाते हैं। शायद अंत में एक को भी हटाया जाना चाहिए (अगर आवेदक, तो आप यहां व्हाइटस्पेस भी ट्रिम कर सकते हैं)।
अंतिम HTML आउटपुट: अच्छा उत्पादन प्रारूपण के लिए
<div>
<p class="break">
This text should be wrapped in a p tag.
</p>
</div>
<p class="break">
This also should be wrapped.
</p>
<p class="break">
<b>And</b> this.</p>
कुछ और बाद के उत्पादन उपयोगी भी हो सकता है। असल में मुझे लगता है कि ऐसा करने के लायक है क्योंकि इससे आपको एल्गोरिदम (Full Demo) को ट्विक करने में मदद मिलेगी - बस देखकर, व्हाइटसाइट सामान्यीकरण शायद वहां लागू नहीं होता है। इसलिए देखभाल के साथ उपयोग करें)।
आपने अपने XPath अभिव्यक्ति में '// div' क्यों रखा है यदि आप 'div' के बाहर टेक्स्ट नोड्स भी चुनना चाहते हैं? [यह बेवकूफ] (http://codepad.org/hzOefCsH) ऐसा लगता है जो आप चाहते हैं। – nwellnhof
क्या आप मुझे बता सकते हैं कि मैंने ऊपर दिए गए समाधान के साथ क्या गलत है? क्या आप न्यूलाइन के साथ टेक्स्ट को कई अनुच्छेदों में कनवर्ट करना चाहते हैं? – nwellnhof
@nwellnhof, आपका समाधान ठीक है - लेकिन यह कोई जवाब नहीं है इसलिए मैं आपको कुछ भी नहीं दे सकता। – Xeoncross