2012-09-23 35 views
5

उदाहरण इनपुट स्ट्रिंग: test:)test:)test:) :) test:p test
वांटेड उत्पादन स्ट्रिंग: test :) test :) test :) :) test :p testरिक्त स्थान पहले से मौजूद नहीं हैं, तो एक सबस्ट्रिंग के चारों ओर रिक्त स्थान जोड़ने के लिए कैसे?

आप ऊपर के उदाहरण में देख सकते हैं, मैं स्ट्रिंग पार्स और सभी पूर्वनिर्धारित स्माइली कोड के आसपास जोड़ा रिक्त स्थान के साथ एक आउटपुट स्ट्रिंग का उत्पादन करना चाहते हैं।

मैं इसे दो लूपों के साथ करने की कोशिश कर रहा था लेकिन अंत में यह 100% अपेक्षित काम नहीं करता था और यह बड़े दस्तावेज़ों पर बहुत धीमा था।

तो मैं सोच रहा हूं कि PHP के साथ इस तरह के पार्सिंग करने का सबसे अच्छा और सबसे प्रभावी तरीका क्या होगा?

+5

नियमित अभिव्यक्ति। उन्हें सीखें, उनका आनंद लें और यह पता लगाएं कि इसे 'preg_replace' – Prinzhorn

+0

की एक पंक्ति में करना वास्तव में आसान है मैंने पहले preg_replace() के साथ ऐसा करने का प्रयास किया लेकिन यह किसी कारण से काम नहीं करता था। क्या आप यहां मेरी मदद कर सकते हैं? – Erik

+0

@ प्रिंज़ोर्न मैंने '$ text = preg_replace ('/([^]): \\) ([^])/i ',' $ 1 :) $ 2 ', $ text) के साथ प्रयास किया लेकिन काम नहीं करता है। कोई विचार क्या इसके साथ गलत है? – Erik

उत्तर

0

इसके बजाय नियमित अभिव्यक्ति आप str_replace फ़ंक्शन का उपयोग कर सकते हैं। पीएचपी समारोह str_replace पैरामीटर के रूप में सरणियों प्राप्त कर सकते हैं, तो आप इस कोशिश कर सकते हैं:

$input = 'test:)test:)test:) :) test:p test'; 
$smileys = array(':)', ':p'); 
$smileys_with_spaces = array(' :)', ' :p'); 
$output = str_replace($smileys_with_spaces, $smileys, $input); // test:) :) -> test:):) 
$output = str_replace($smileys, $smileys_with_spaces, $input); // test:):) -> test :) :) 
+0

के साथ एकाधिक रिक्त स्थान को प्रतिस्थापित करें, यह उपयोग करने योग्य समाधान की तरह नहीं दिखता है क्योंकि यह अत्यधिक रिक्त स्थान जोड़ देगा। उदाहरण के लिए, यह स्माइली कोड में रिक्त स्थान जोड़ देगा, जिनके पास पहले से ही रिक्त स्थान हैं। – Erik

+0

नियमित अभिव्यक्ति बेहतर तरीका है। @xdazz ने अधिक विनियमित समाधान दिया। – doktorgradus

+0

बस 'str_replace (' ',' ', $ इनपुट) द्वारा अतिरिक्त रिक्त स्थान हटाएं; '। – doktorgradus

0

प्रयास करें:

$str = "test:)test:)test:) :) test:p test"; 
$str = preg_replace('/(?<=[a-z])(?=[^a-z\s])|(?<=[^a-z]{2})(?=[a-z])/', ' ', $str); 
+0

यह एक काम नहीं करेगा जब दो smileycodes एक दूसरे के बगल में हैं। तो $ str के साथ ":) :)", यह कोई स्थान नहीं जोड़ रहा है – Erik

+0

@Erik क्या आप पैटर्न तय कर रहे हैं? – xdazz

0

एन स्माइली लिए समर्थन के साथ अद्यतन

$smile = array(':)', ':p'); 

//Escape smiley chars for use in rx 
foreach($smile as &$s) { 
    $s = preg_quote($s, '/'); 
}unset($s); 

$rx = implode('|', $smile); 

$str = 'test:)test:)test:) :) test:p test'; 

$str = preg_replace('/ *('.$rx.') */', ' $1 ', $str); 
$str = preg_replace('/('.$rx.') +/', '$1 ', $str); 

echo $str; 
+0

यह एक काम करता है सिवाय इसके कि यदि दो स्माइलीकोड एक दूसरे के बगल में हैं तो यह बहुत अधिक रिक्त स्थान जोड़ देगा। उदाहरण के लिए ":) :)" बन जाएगा " :) :) " जबकि मुझे चाहिए ":) :)" इस उदाहरण में। – Erik

+0

कोई विचार है कि मैं इसे कैसे ठीक कर सकता हूं? – Erik

+0

यह अद्यतन अभी भी स्ट्रिंग की शुरुआत या समाप्ति पर अत्यधिक रिक्त स्थान को ठीक नहीं करेगा। और मैं ट्रिम() का उपयोग नहीं कर सकता क्योंकि अगर मूल शुरुआत या समाप्ति पर रिक्त स्थान पर है, तो उसे इस तरह रहना होगा। – Erik

2

नेस्टेड प्रतिस्थापन:

preg_replace("/\s\s+/", " ", 
    str_replace(Array(":)", ":p"), 
     Array(" :) ", " :p "), $str)); 
0

आप भी शुरुआत/अंत में अतिरिक्त रिक्त स्थान नहीं चाहते हैं, इस प्रयास करें:

$str = ':):)test:)test:)test:) :) test:p:) test'; 
$codes = array(
    ':)', ':p', // Add smileys here. 
); 

// We build the $regexp automatically 
$regexp = array(); 
foreach($codes as $smiley) 
    $regexp[] = preg_quote($smiley, '#'); 
$regexp = implode('|', $regexp); 
// Afterwards, we might replace the above with $regexp = 'VERYCOMPLICATEDSYNTAX'; 

// Split the string at smileys, trimming the smileys as we go, 
// and returning an array of smiley-and-non-smiley parts, except for empty ones 
$parts = preg_split("#\s*($regexp)\s*#", $str, -1, 
    PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); 

// The new delimiter is a single space. 
$str = implode(' ', $parts); 

ध्यान दें कि मैं एक शाब्दिक अंतरिक्ष के खाली स्थान के मिलान \s का इस्तेमाल किया है बजाय; यदि आपके पास मूल स्ट्रिंग में लाइन फ़ीड्स हैं तो इसमें अवांछित परिणाम हो सकते हैं। यदि ऐसा है, तो "\s" को शाब्दिक स्थान के साथ बदलें।

0

वहाँ एक और अधिक सुरुचिपूर्ण समाधान होना चाहिए, लेकिन नीचे दिए गए कोड काम करना चाहिए

$patterns = array(); 
$replacements = array(); 

$str = ':) test :)test:) test :)'; 

$smileys = array(':)', ':p'); 

foreach($smileys as &$s) { 
    $s = preg_quote($s, '/'); 
}unset($s); 
$escaped_smiley = implode('|', $smileys); 

$patterns[] = '/([^\s])('.$escaped_smiley.')([^\s])/'; // no spaces 
$patterns[] = '/([\s])('.$escaped_smiley.')([^\s])/'; // space on left 
$patterns[] = '/([^\s])('.$escaped_smiley.')([\s])/'; // space on right 

$patterns[] = '/^('.$escaped_smiley.')([\s])/'; // line starting, space succeding 
$patterns[] = '/^('.$escaped_smiley.')([^\s])/'; // line starting, no space 
$patterns[] = '/([\s])('.$escaped_smiley.')$/'; // line ending, space preceeding 
$patterns[] = '/([^\s])('.$escaped_smiley.')$/'; // line ending, no space 

$replacements[] = '$1 $2 $3'; // no spaces 
$replacements[] = '$1$2 $3'; // space on left 
$replacements[] = '$1 $2$3'; // space on right 

$replacements[] = ' $1$2'; // line starting 
$replacements[] = ' $1 $2'; // line starting 
$replacements[] = '$1$2 '; // line ending 
$replacements[] = '$1 $2 '; // line ending 


$result = preg_replace($patterns, $replacements, $str); 
echo str_replace(' ', '^', $result); 

[@Prinzhorn से उधार कोड के साथ संपादित]

+0

यह इनपुट स्ट्रिंग को विफल करता है जैसे::) test:) test:) test :) ' – Erik

+0

आउटपुट है:) टेस्ट :) टेस्ट :) टेस्ट :) .. पहले इमोटिकॉन कोड के अंत में लापता रिक्त स्थान पर ध्यान दें और आखिरी से पहले। – Erik

+0

@Erik ने खाता लाइन शुरू करने और समाप्त करने के लिए कोड संपादित किया। 'इफ्रोड' के साथ 'foreach' लूप को भी हटा दिया और @Prinzhorn से' foreach' loop उद्धृत करने के साथ उद्धृत स्माइलीज़ को प्रतिस्थापित किया। – air4x

0

आप अभी तक समस्या हल नहीं किया है, मैं आया एक समाधान के साथ काम कर सकते हैं। पहले रिक्त स्थान के साथ स्ट्रिंग को डिलीमीटर के रूप में विस्फोट करें, मुस्कुराहट को अतिरिक्त रिक्त स्थान से बदलें और उन्हें इंपोड के साथ दोबारा बदलें।

कार्यान्वयन के लिए php fiddle देखें।

1
<?php 

$lspace = str_replace(":"," :","test:)test:)test:) :) test:p"); 
$rspace = str_replace(")",") ",$lspace); 
$out = preg_replace("/\s\s+/"," ",$rspace); 


echo $out; 
?> 

उत्पादन: test :) test :) test :) :) test :p