2010-06-02 23 views
8

के साथ डबल
को प्रतिस्थापित करना, मैं अपने सीएमएस में आरटीएफ डेटा लिखने के लिए nicEdit का उपयोग करता हूं।php:</p><p>

<p>hello first line</p><p>this is a second line<br />this is a 3rd line</p> 

तो मेरे वर्तमान समाधान यह है:

hello first line<br><br />this is a second line<br />this is a 3rd line 

इस के बाद से एक समाचार साइट के लिए है, मैं बहुत अंतिम एचटीएमएल पसंद करते हैं इस तरह होने के लिए: समस्या यह है कि इस तरह तार उत्पन्न करता है:

  1. मैं स्ट्रिंग
  2. की शुरुआत/अंत में <br /> के लिए $ डेटा ट्रिम करने के लिए सभी स्ट्रिंग है 2की जगह की जरूरत है </p><p> के साथया अधिक (एक एकल <br /> की अनुमति है)।
  3. अंत में, अंत

पर शुरू में <p> और </p> जोड़ने मैं केवल 1 और 3 अब तक की है। क्या कोई मुझे चरण 2 के साथ हाथ दे सकता है?

function replace_br($data) { 
# step 1 
$data = trim($data,'<p>'); 
$data = trim($data,'</p>'); 
$data = trim($data,'<br />'); 
# step 2 ??? 
// preg_replace() ? 
# step 3 
$data = '<p>'.$data.'</p>'; 
return $data; 
} 

धन्यवाद!

ps: विशिष्ट परिस्थितियों से बचने के लिए यह बेहतर होगा। उदाहरण: "hello<br /><br /><br /><br /><br />too much space" - उन 5 breaklines भी सिर्फ एक "</p><p>"

अंतिम समाधान करने के लिए परिवर्तित किया जाना चाहिए

function sanitize_content($data) { 
    $data = strip_tags($data,'<p>,<br>,<img>,<a>,<strong>,<u>,<em>,<blockquote>,<ol>,<ul>,<li>,<span>'); 
    $data = trim($data,'<p>'); 
    $data = trim($data,'</p>'); 
    $data = trim($data,'<br />'); 
    $data = preg_replace('#(?:<br\s*/?>\s*?){2,}#','</p><p>',$data); 
    $data = '<p>'.$data.'</p>'; 
    return $data; 
} 

उत्तर

13

यह भले ही दो <br> रों हैं काम करेंगे विभिन्न लाइनों पर (यानी उनके बीच एक नई लाइन या कोई सफेद जगह है):

function replace_br($data) { 
    $data = preg_replace('#(?:<br\s*/?>\s*?){2,}#', '</p><p>', $data); 
    return "<p>$data</p>"; 
} 
+0

आप आदमी हैं! हेहे, preg_replace ऐसा करने का सबसे प्रभावी तरीका है। धन्यवाद! मुझे regexp बेहतर सीखना है। – andufo

+0

'
' के बारे में क्या? – Gumbo

+0


को "?" लागू करते समय भी ध्यान रखा जा रहा है regexp – andufo

2

यह दृष्टिकोण आपकी समस्या का समाधान होगा:

(केम्प के लिए विशेष धन्यवाद!)
  1. <br> या <br /> पर स्ट्रिंग को विभाजित करें: आपको तारों की एक सरणी मिल जाएगी।
  2. एक नई स्ट्रिंग <p> बनाएं।
  3. शुरुआत से अंत तक 1 की सरणी पर लूप, खाली होने वाली सभी प्रविष्टियों को खाली (ब्रेक) तक खाली होने तक हटाएं।
  4. 3 के समान, लेकिन अंत में सरणी की शुरुआत से।
  5. 1 की सरणी पर लूप, एक पूर्णांक मान ए (डिफ़ॉल्ट 0) है, जिसमें कहा गया है कि एक सिंगल या डबल ब्रेक है।
    1. यदि स्ट्रिंग खाली है, तो ए और के मान को लूप जारी रखें।
    2. स्ट्रिंग खाली नहीं है, तो:
      1. तो एक का मान 1 से कम है या, एक <br> जोड़ देते हैं।
      2. यदि ए 2 का मान 2 या उससे ऊपर है, तो </p><p> संलग्न करें।
    3. वर्तमान प्रविष्टि की सामग्री संलग्न करें (जो खाली नहीं है)।
    4. ए से 0 का मान सेट करें।
  6. संलग्न </p>

एक अलग दृष्टिकोण: रेगुलर एक्सप्रेशन

(<br ?/?>){2,} 

का उपयोग कर 2 या <br> अधिक से मेल खाएगी। (php.net on preg_split देखें कि यह कैसे करें।)

अब, चरण 2 और 3 पर एक ही दृष्टिकोण: सरणी पर दो बार लूप, शुरुआत से (0 .. लम्बाई) और एक बार अंत से नीचे (लंबाई -1..0)। अगर प्रविष्टि खाली है, तो इसे सरणी से हटा दें। अगर प्रविष्टि खाली नहीं है, तो लूप छोड़ दें।

ऐसा करने के लिए:

$array = preg_split('/(<br ?/?>\s*){2,}/i', $string); 

foreach($i = 0; $i < count($array); $i++) { 
    if($value == "") { 
     unset($array[$i]); 
    }else{ 
     break; 
    } 
} 

foreach($i = count($array) - 1; $i >= 0; $i--) { 
    if($value == "") { 
     unset($array[$i]); 
    }else{ 
     break; 
    } 
} 

$newString = '<p>' . implode($array, '</p><p>') . '</p>'; 
+0

वास्तव में यह भी बेहतर होगा अगर वें ere 2 या अधिक
के साथ एक स्ट्रिंग खोजने का एक तरीका था - मैं preg_replace पर सोच रहा हूं लेकिन अभी भी जारी रखने के बारे में एक विचार है। – andufo

+0

पहला दृष्टिकोण उनको संभालता है। दूसरा दृष्टिकोण लागू करना अधिक आसान है, लेकिन सवाल यह है कि क्या आप HTML पर RegEx का उपयोग करना चाहते हैं (कुछ लोग उस दृष्टिकोण को पसंद नहीं करते हैं)। पैटर्न के लिए – Pindatjuh

+0

धन्यवाद, लेकिन मुझे लगता है कि कुछ गलत है। मैं उपयोग कर रहा हूँ: $ data = preg_replace ('(
) {2,}', 'aaa', $ डेटा); और यह शून्य आता है। क्यूं कर? (लागू होने के बाद इसे और अधिक दृश्यमान बनाने के लिए "aaa" का उपयोग कर रहा हूं) – andufo

0

मुझे लगता है कि यह जब तक कि मैं अपने परिदृश्य पूरी तरह से समझ नहीं कर रहा हूँ चरण # 2 के लिए काम करना चाहिए:

$string = str_replace('<br><br>', '</p><p>', $string); 
$string = str_replace('<br /><br />', '</p><p>', $string); 
$string = str_replace('<br><br />', '</p><p>', $string); 
$string = str_replace('<br /><br>', '</p><p>', $string); 
+0

विचार के लिए धन्यवाद, लेकिन यह मूलभूत है। मुझे एक और उन्नत दृष्टिकोण की जरूरत है। शीर्ष पर अंतिम समाधान देखें। – andufo

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