2012-03-22 12 views
14

मैं PHP में थोड़ा सा स्मार्ट बनाने के लिए एक तरीका तलाश रहा हूं। तो यह एक पंक्ति पर अकेले किसी भी छोटे छोटे शब्द को छोड़ने वाले लंबे शब्दों को पूर्व-ब्रेक नहीं करता है।लंबे शब्दों के लिए PHP में स्मार्ट शब्द-लपेटें?

चलो कहते हैं कि मैं इस करते हैं (वास्तविक पाठ हमेशा पूरी तरह से गतिशील है, यह सिर्फ दिखाने के लिए है):

wordwrap('hello! heeeeeeeeeeeeeeereisaverylongword', 25, '<br />', true); 

यह आउटपुट:

हैलो!
heeeeeeeeeeeeeeereisavery
longword

देखें, यह पहली पंक्ति पर अकेले छोटे शब्द छोड़ देता है। मैं इसे इस तरह कुछ और आउटपुट के लिए कैसे प्राप्त कर सकता हूं:

हैलो! heeeeeeeeeeee
eeereisaverylongword

तो यह प्रत्येक पंक्ति पर किसी भी उपलब्ध स्थान का इस्तेमाल करता है। मैंने कई कस्टम फ़ंक्शंस की कोशिश की है, लेकिन कोई भी प्रभावी नहीं रहा है (या उनमें कुछ कमीएं थीं)।

+0

जैसे अजीब लपेटता नहीं है, मैं अभी Google से यहां आया हूं। मुझे आश्चर्य है कि यह काम नहीं करता है। क्या यह PHP के अंतर्निर्मित फ़ंक्शन के साथ एक बग है? ऐसा लगता है कि जब आप अंतिम तर्क को सत्य पर सेट करते हैं तो इसे सभी उपलब्ध स्थान का उपयोग करना चाहिए। ऐसा क्यों नहीं करेगा? –

+0

@ एंड्रयू हाँ, मुझे नहीं पता। आप सीएसएस रैप विधि, या यह http://stackoverflow.com/questions/9815040/smarter-word-wrap-in-php-for-long-words/25273135#25273135 (यदि यह वेबब्रोइंग आदि के लिए है) का उपयोग कर सकते हैं। शांति – mowgli

उत्तर

15

मैं एक मिला है है का उपयोग कर वापस एक साथ सरणी मिलती है एक स्ट्रिंग के रूप इस स्मार्ट WordWrap के लिए कस्टम समारोह में जाना:

function smart_wordwrap($string, $width = 75, $break = "\n") { 
    // split on problem words over the line length 
    $pattern = sprintf('/([^ ]{%d,})/', $width); 
    $output = ''; 
    $words = preg_split($pattern, $string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); 

    foreach ($words as $word) { 
     if (false !== strpos($word, ' ')) { 
      // normal behaviour, rebuild the string 
      $output .= $word; 
     } else { 
      // work out how many characters would be on the current line 
      $wrapped = explode($break, wordwrap($output, $width, $break)); 
      $count = $width - (strlen(end($wrapped)) % $width); 

      // fill the current line and add a break 
      $output .= substr($word, 0, $count) . $break; 

      // wrap any remaining characters from the problem word 
      $output .= wordwrap(substr($word, $count), $width, $break, true); 
     } 
    } 

    // wrap the final output 
    return wordwrap($output, $width, $break); 
} 

$string = 'hello! too long here too long here too heeeeeeeeeeeeeereisaverylongword but these words are shorterrrrrrrrrrrrrrrrrrrr'; 
echo smart_wordwrap($string, 11) . "\n"; 

संपादित: चेतावनियां के एक जोड़े को देखा। इसके साथ एक प्रमुख चेतावनी (और मूल कार्य के साथ) मल्टीबाइट समर्थन की कमी है।

+0

$ चौड़ाई = 75 सेट सफलतापूर्वक क्या करता है? – mowgli

+0

फ़ंक्शन हस्ताक्षर बिल्कुल वर्डवाप (ब्रेक पैरामीटर के बिना) है, इसलिए यह 75 अक्षरों की डिफ़ॉल्ट रैप चौड़ाई सेट करता है। – cmbuckley

+0

कुछ भी नहीं, यह केवल डिफ़ॉल्ट मानों का उपयोग कर रहा है। यदि आप '11' के साथ अपना खुद का आपूर्ति नहीं करते हैं, तो' 75' का उपयोग किया जाएगा। – Eli

2

इस चाल करना चाहिए ...

$word = "hello!" . wordwrap('heeeeeeeeeeeeeeereisaverylongword', 25, '<br />', true); 
echo $word; 
+0

मैंने अभी कुछ उदाहरण शब्दों का उपयोग किया है। वास्तविक उपयोग में, पाठ पूरी तरह से गतिशील होगा, इसलिए मैं उस – mowgli

+0

का उपयोग नहीं कर सका, यह सुनिश्चित नहीं है कि आप इसे कैसे करने की कोशिश कर रहे हैं, लेकिन आप इसे गतिशील रूप से क्यों नहीं बदल सकते? बस अपना टेक्स्ट –

+0

सेट करने के लिए चर का उपयोग करें गतिशील रूप से क्या बदलें? पाठ कुछ भी हो सकता है, किसी भी लंबाई, शब्दों की किसी भी संख्या। मुझे नहीं पता कि पहला शब्द या कोई शब्द क्या होगा;) – mowgli

5

इसे पूर्ण करने के सीएसएस का उपयोग कर सकते हैं।

word-wrap: break-word; 

यह आपके लिए शब्द तोड़ देगा।

http://www.css3.info/preview/word-wrap/

+3

मैं ब्राउज़र के लिए शब्दों को तोड़ नहीं रहा – mowgli

+0

यह मेरे लिए काम नहीं करता है। मैंने इसे टेबल के टीडी पर करने की कोशिश की। मैंने शैली के तहत कुछ 'चौड़ाई' लागू की और 'शब्द-लपेटें: ब्रेक-शब्द;' –

+0

यह 2014 है और यह अभी भी हर ब्राउज़र में काम नहीं करता है। कभी-कभी PHP आपके बट को ढकता है। – Maelish

11

कैसे के बारे में

$string = "hello! heeeeeeeeeeeeeeereisaverylongword"; 
$break = 25; 

echo implode(PHP_EOL, str_split($string, $break)); 

कौन सा आउटपुट

hello! heeeeeeeeeeeeeeere                                       
isaverylongword 

str_split() $ की एक सरणी तोड़ने आकार करने के लिए स्ट्रिंग में कनवर्ट करता है: यहाँ कार्रवाई में यह देखने के लिए एक कड़ी है मात्रा।

फटना() गोंद जो इस मामले में लाइन मार्कर (PHP_EOL) का अंत हालांकि यह रूप में आसानी से किया जा सकता है एक '<br/>'

+0

शब्द लपेटने के बाद कहां जाता है? ;) – mowgli

+0

@frglps आप प्रतिभाशाली हैं। आपके उत्तर के लिए धन्यवाद ... –

+0

यो भी 2017 है यह बहुत उपयोगी है! धन्यवाद :) – LecheDeCrema

9

यह भी एक समाधान है (ब्राउज़रों आदि के लिए)):

$string = 'hello! heeeeeeeeeeeeeeeeeeeeeereisaverylongword'; 
echo preg_replace('/([^\s]{20})(?=[^\s])/', '$1'.'<wbr>', $string); 

यह 20 या अधिक वर्ण

<wbr> का अर्थ है "शब्द को तोड़ने अवसर" तो यह केवल टूट जाता है इसे करने के लिए (तत्व/ब्राउज़र की चौड़ाई से निर्धारित है यदि/साथ शब्द पर एक <wbr> डालता है दर्शक/अन्य)। यह अन्यथा अदृश्य है।

द्रव/उत्तरदायी लेआउट के लिए अच्छा जहां कोई निश्चित चौड़ाई नहीं है। और php के wordwrap

संबंधित मुद्दे