मैं एक php वर्ग नीचे चिपकाने कर रहा हूँ मैं एक लंबे समय पहले लिखा था, लेकिन मैं यह काम करता है पता है। यह ठीक नहीं है कि आप क्या कर रहे हैं, क्योंकि यह एक चरित्र गणना के बजाय शब्दों से संबंधित है, लेकिन मुझे इसकी सुंदर नज़दीकी आकृति है और किसी को यह उपयोगी लगेगा।
class HtmlWordManipulator
{
var $stack = array();
function truncate($text, $num=50)
{
if (preg_match_all('/\s+/', $text, $junk) <= $num) return $text;
$text = preg_replace_callback('/(<\/?[^>]+\s+[^>]*>)/','_truncateProtect', $text);
$words = 0;
$out = array();
$text = str_replace('<',' <',str_replace('>','> ',$text));
$toks = preg_split('/\s+/', $text);
foreach ($toks as $tok)
{
if (preg_match_all('/<(\/?[^\x01>]+)([^>]*)>/',$tok,$matches,PREG_SET_ORDER))
foreach ($matches as $tag) $this->_recordTag($tag[1], $tag[2]);
$out[] = trim($tok);
if (! preg_match('/^(<[^>]+>)+$/', $tok))
{
if (!strpos($tok,'=') && !strpos($tok,'<') && strlen(trim(strip_tags($tok))) > 0)
{
++$words;
}
else
{
/*
echo '<hr />';
echo htmlentities('failed: '.$tok).'<br /)>';
echo htmlentities('has equals: '.strpos($tok,'=')).'<br />';
echo htmlentities('has greater than: '.strpos($tok,'<')).'<br />';
echo htmlentities('strip tags: '.strip_tags($tok)).'<br />';
echo str_word_count($text);
*/
}
}
if ($words > $num) break;
}
$truncate = $this->_truncateRestore(implode(' ', $out));
return $truncate;
}
function restoreTags($text)
{
foreach ($this->stack as $tag) $text .= "</$tag>";
return $text;
}
private function _truncateProtect($match)
{
return preg_replace('/\s/', "\x01", $match[0]);
}
private function _truncateRestore($strings)
{
return preg_replace('/\x01/', ' ', $strings);
}
private function _recordTag($tag, $args)
{
// XHTML
if (strlen($args) and $args[strlen($args) - 1] == '/') return;
else if ($tag[0] == '/')
{
$tag = substr($tag, 1);
for ($i=count($this->stack) -1; $i >= 0; $i--) {
if ($this->stack[$i] == $tag) {
array_splice($this->stack, $i, 1);
return;
}
}
return;
}
else if (in_array($tag, array('p', 'li', 'ul', 'ol', 'div', 'span', 'a')))
$this->stack[] = $tag;
else return;
}
}
truncate आप क्या चाहते है, और आप इसे एचटीएमएल और शब्द आप चाहते हैं यह करने के लिए कांट छांट की संख्या गुजरती हैं। यह शब्दों की गिनती करते समय एचटीएमएल को अनदेखा करता है, लेकिन फिर छेड़छाड़ के कारण एचटीएमएल में सब कुछ दोहराता है, यहां तक कि पिछला टैग बंद कर देता है।
कृपया ओओपी सिद्धांतों की पूरी कमी पर मेरा फैसला न करें। मैं युवा और बेवकूफ था।
संपादित करें:
तो यह पता चला है उपयोग अधिक इस तरह है:
$content = $manipulator->restoreTags($manipulator->truncate($myHtml,$numOfWords));
बेवकूफ डिजाइन निर्णय। हालांकि मुझे अनजान टैग के अंदर एचटीएमएल इंजेक्ट करने की अनुमति दी।
क्या आप पाठ को HTML के बिना गिना जाना चाहते थे, लेकिन फिर मूल HTML में लपेटा गया? –
हां। मैं चाहता हूं कि इसे HTML में लपेटा जाए ताकि मैं इसे किसी पृष्ठ पर प्रदर्शित कर सकूं। – Vin
मैंने अपने पिछले उत्तर में कुछ छद्म जोड़ा है - उम्मीद है कि यह आपको सही दिशा में इंगित कर सकता है। मुझे सचमुच खेद है कि मुझे इसे सही बनाने के लिए काम करने का समय नहीं मिला है, लेकिन उंगलियों को पार करने से आपको बाधा मिल जाएगी। अगर आप समाधान के साथ आते हैं तो अपना जवाब पोस्ट करें! मुझे देखना अच्छा लगेगा। –