मैं एक पंक्ति में तार कैसे डाल सकता हूं, नई रेखा से विभाजित कर सकता हूं?


220

मेरे डेटाबेस में लाइन ब्रेक के साथ एक स्ट्रिंग है। मैं उस स्ट्रिंग को एक सरणी में बदलना चाहता हूं, और हर नई पंक्ति के लिए, सरणी में एक सूचकांक स्थान को कूदता हूं।

यदि स्ट्रिंग है:

My text1
My text2
My text3

जो परिणाम मुझे चाहिए वह यह है:

Array
(
    [0] => My text1
    [1] => My text2
    [2] => My text3
)

1
मैं PHP नहीं जानता, लेकिन आमतौर पर एक फ़ंक्शन होता है जिसे स्ट्रिंग्स के लिए "विभाजन" कहा जाता है। यह इस तरह काम करता है: सरणी = विभाजन (स्ट्रिंग, "\ n")
सेदत कपपनोग्लू

आपको सबसे पहले नए सिरे को सामान्य करना चाहिए, शायद। यह विधि github.com/delight-im/PHP-Str (MIT लाइसेंस के तहत पुस्तकालय) के s($yourString)->normalizeLineEndings()साथ उपलब्ध है जिसमें बहुत से अन्य उपयोगी स्ट्रिंग हेल्पर्स हैं। आप स्रोत कोड पर एक नज़र रखना चाहते हैं।
कौवा

जवाबों:


291

आप विभाजक के रूप में explode" \n" का उपयोग करके फ़ंक्शन का उपयोग कर सकते हैं :

$your_array = explode("\n", $your_string_from_db);

उदाहरण के लिए, यदि आपके पास यह कोड है:

$str = "My text1\nMy text2\nMy text3";
$arr = explode("\n", $str);
var_dump($arr);

आपको यह आउटपुट मिलेगा:

array
  0 => string 'My text1' (length=8)
  1 => string 'My text2' (length=8)
  2 => string 'My text3' (length=8)


ध्यान दें कि आपको डबल-उद्धृत स्ट्रिंग का उपयोग करना है , इसलिए \nवास्तव में लाइन-ब्रेक के रूप में व्याख्या की जाती है।
(अधिक विवरण के लिए वह मैनुअल पेज देखें।)


52
इसके बजाय \nआप पूर्वनिर्धारित स्थिरांक का उपयोग कर सकते हैं PHP_EOL
टिम

40
हर कोई इस समाधान के साथ सावधान रहना चाहिए, क्योंकि यह सभी नईलाइन्स पर काम नहीं करता है। मुझे डेविड के जवाब के साथ सबसे अधिक सफलता मिली है
मौरिस

1
आपको सभी प्रकार के ग्रंथों को संभालने में सक्षम होने के लिए या तो \ n या \ r पर विभाजित होना चाहिए - यह केवल linux और windows newlines के साथ काम करेगा। मैक न्यूलाइन्स की अवहेलना होगी! (ए आर)
स्टीव होरवथ

1
मुझे लगता है कि Tims उत्तर / टिप्पणी सही नहीं है, क्योंकि यह केवल आपके सिस्टम के लाइनब्रेक से मेल खाएगा, लेकिन जब आपको ऐसे तार मिलते हैं जिनमें अन्य सिस्टम से लाइनब्रेक होता है तो यह काम नहीं करेगा! ईमेल के साथ यह समस्या थी
आसरा

7
यह जवाब नहीं है और इस जवाब पर टिप्पणी गलत है! क्योंकि यह OS की नई लाइन वर्ण में कारक नहीं है, विशेष रूप से नहीं PHP_EOL। आपको अवश्य उपयोग करना चाहिए preg_split("/\\r\\n|\\r|\\n/", $value)
kjdion84

331

मैंने इसे हमेशा बड़ी सफलता के साथ उपयोग किया है:

$array = preg_split("/\r\n|\n|\r/", $string);

(अंतिम \ r के साथ अद्यतन, धन्यवाद @LstersterMan)


11
यह जवाब पास्कल के बजाय शीर्ष पर होना चाहिए। कि सभी मामलों पर काम नहीं किया।
जितेश केटी

1
यह उत्तर है। मान्य एक गलत है। खैर, हेस्सेल्बॉम के पास भी है ... आप इस समतुल्य का उपयोग भी कर सकते हैं: preg_split ('/ \ n = \ r /', $ string, -1, PREG_SPLIT_NO_EMPTY); सुंदरता के लिए :) यह एकमात्र अच्छा जवाब क्यों है? क्योंकि आप यह नहीं मान सकते कि आपको किस प्रकार की पंक्ति मिलेगी: मैक (\ r), विंडोज (\ r \ n), या यूनिक्स (\ n)।
Ninj



यह उदाहरण सही है क्योंकि आप किसी भी विभाजन ऑपरेशन को नहीं ले सकते हैं जो कि केवल एक वर्ण पर आधारित है। यदि आप ऐसा करते हैं, तो '\ r' या '\ n' पर ट्रिगर करने से आप विंडोज "\ r \ n" समाप्त होने की स्थिति में एक अति-रिक्त खाली रेखा के साथ समाप्त हो जाएंगे। और यह महत्वपूर्ण है कि दो-चरित्र वाला विंडोज विभाजक पहले परीक्षण किया गया हो।
एंड्रेसरोह्रैटलासफॉर्मफॉर्म

281

अलग-अलग प्लेटफ़ॉर्म, \ r \ n, \ r या \ n पर अलग से एक लाइन ब्रेक को परिभाषित किया गया है।

RegExp का उपयोग करके स्ट्रिंग को विभाजित करने के लिए आप \ R के साथ तीनों का मिलान कर सकते हैं

तो आपकी समस्या के लिए:

$array = preg_split ('/$\R?^/m', $string);

यह विंडोज, मैक और लिनक्स पर लाइन ब्रेक से मेल खाएगा!


3
मैंने इस धागे पर स्वीकृत उत्तर और किसी अन्य उत्तर के बजाय इसका उपयोग किया। बस इस टिप्पणी को एक सूचनात्मक के रूप में छोड़कर।
सेठ मलकी

3
दरअसल, यह मेरे काम नहीं आया। कभी-कभी newlines जहां अभी भी सरणी कुंजियों में मौजूद हैं।
मौरिस


32
बस का उपयोग करें$array = preg_split ('/\R/', $string);
Jan Goyvaerts

18
कभी-कभी काम नहीं कर रहा है! preg_split("/\r\n|\n|\r/", $string)बेहतर विकल्प
एलेक्सी बी।

34

PHP पहले से ही मौजूदा सिस्टम की न्यूलाइन कैरेक्टर (एस) को जानता है। बस EOL स्थिरांक का उपयोग करें।

explode(PHP_EOL,$string)

18
हां, लेकिन एक फ़ाइल को संपादित कर सकते हैं या इस उदाहरण के रूप में विंडोज में एक डीबी प्रविष्टि तो एक लिनक्स सिस्टम पर उपयोग करें, उदाहरण के लिए। मुझे लगता है कि एक सामान्य दृष्टिकोण बेहतर होगा।
क्रैनियो डे

मुझे यकीन नहीं है कि यह सही है। यदि किसी वेब पेज पर कोई पाठ क्षेत्र सबमिट किया जाता है, तो इसमें उपयोगकर्ता के ब्राउज़र के आधार पर अलग-अलग अंत-पंक्ति वर्ण हो सकते हैं, न कि सर्वर का ऑपरेटिंग सिस्टम। तो कोई फर्क नहीं पड़ता कि आप किस ओएस का उपयोग कर रहे हैं, आपको कुछ भी पार्स करने में सक्षम होना चाहिए। यह मान रहे हैं कि आप वेब सामग्री का कोर्स कर रहे हैं।
मैगमैटिक

फिर आपको trim()किसी भी बाहरी व्हाट्सएप को निकालने के लिए परिणामी तारों पर उपयोग करना पड़ सकता है ।
टिम

30

डेविड के जवाब का एक विकल्प जो तेज है (तेजी से रास्ता) का उपयोग करना है str_replaceऔर explode

$arrayOfLines = explode("\n",
                    str_replace(["\r\n","\n\r","\r"],"\n",$str)
            );

क्या हो रहा है:
चूँकि लाइन ब्रेक विभिन्न रूपों में आ सकते हैं, I str_replace\ r \ n, \ n \ r, और \ n with \ n बजाय (और मूल \ n संरक्षित हैं)।
फिर विस्फोट करें \nऔर आपके पास एक सरणी में सभी लाइनें हैं।

मैंने इस पृष्ठ के src पर एक बेंचमार्क किया और लूप के लिए लाइनों को 1000 बार विभाजित किया: और
preg_replace11 सेकंड
str_replace & explodeका एक एवीजी लिया और लगभग 1 सेकंड का एक एवीजी लिया

मेरे मंच पर अधिक विस्तार और बेंमार्क जानकारी


आपका फ़ोरम लिंक (और संपूर्ण डोमेन) नीचे लगता है
निकिता '

19

डेविड: महान दिशा है, लेकिन आप \ r याद किया। यह मेरे लिए काम किया:

$array = preg_split("/(\r\n|\n|\r)/", $string);

11

आपको preg_ * फ़ंक्शंस की आवश्यकता नहीं है और न ही preg पैटर्न और न ही str_replace के भीतर, आदि .. ताकि sucessfuly क्रम में एक स्ट्रिंग को तोड़ दें। सभी स्थितियों में, यह लिनक्स / मैक या एम $ हो, यह करेगा।

<?php 

 $array = explode(PHP_EOL, $string);
 // ...  
 $string = implode(PHP_EOL, $array);

?>

PHP_EOL सर्वर प्लेटफ़ॉर्म द्वारा उपयोग किया जाने वाला लाइन ब्रेक कैरेक्टर (एस) धारण करने वाला एक स्थिर है।


3
फ़ाइल अलग-अलग नई लाइनों के साथ किसी अन्य प्रणाली से आ सकती है, जो कि wich के लिए एक शुद्ध वातावरण में विशेष रूप से PHP
Luca C.

यही कारण है कि यह निरंतर मौजूद है .. और उस विशेष समस्या को संभालता है।
डरावना

यदि आप विंडोज़ से फाइल लेते हैं तो यह यूनिक्स, या मैक से फाइल के समान नहीं है, है ना?
लुका सी।

यदि आप शुद्ध utf-8 का उपयोग हर समय, हर जगह करते हैं, तो utf8 फ़ाइलें शामिल हैं, सामान्य रूप से, और आपके पास लाइन ब्रेक डिटेक्शन के लिए PHP के कुछ भी नहीं बल्कि PHP_EOL है, यह वर्णित के रूप में मिलान किया जाएगा, और कोई अनपेक्षित व्यवहार नहीं होगा। ध्यान रखें कि यह केवल मुझे चिल्लाना और यह दावा नहीं है। PHP_EOL प्रयोज्य काफी पुष्टि की है।
स्पूकी

1
आपके मामले में, अगर स्रोत कहीं और से आते हैं और अच्छी तरह से नहीं बनते हैं, जो भी हो, यह शायद बेहतर है यदि आप str_replace (regexp से तेज) का उपयोग करते हैं। ... सब सब में, यह regexp हो। या str_replace या PHP_EOL, एक अच्छा पुराना वाक्य है: "अगर यह काम करता है - इसे मत छुओ!"। :)
स्पूकी

9
explode("\n", $str);

"(के बजाय ') काफी महत्वपूर्ण है क्योंकि अन्यथा, लाइन ब्रेक को गलत तरीके से व्याख्या नहीं किया जाता है।


9

StackOverflow मुझे hesselbom के उत्तर (पर्याप्त प्रतिष्ठा नहीं) पर टिप्पणी करने की अनुमति नहीं देगा, इसलिए मैं अपना खुद का जोड़ रहा हूं ...

$array = preg_split('/\s*\R\s*/', trim($text), NULL, PREG_SPLIT_NO_EMPTY);

इसने मेरे लिए सबसे अच्छा काम किया क्योंकि यह अग्रणी (दूसरा \ _ *) और अनुगामी (पहले \ _ *) व्हाट्सएप को स्वचालित रूप से समाप्त कर देता है और रिक्त लाइनों (PREG_SPLIT_NO_EMPTY ध्वज) को भी छोड़ देता है।

- = विकल्प = -

यदि आप प्रमुख व्हाट्सएप रखना चाहते हैं, तो बस दूसरे \ _ * से छुटकारा पाएं और इसके बजाय इसे rtrim () बनाएं ...

$array = preg_split('/\s*\R/', rtrim($text), NULL, PREG_SPLIT_NO_EMPTY);

यदि आपको खाली लाइनें रखने की आवश्यकता है, तो NULL से छुटकारा पाएं (यह केवल एक प्लेसहोल्डर है) और PREG_SPLIT_NO_EMPTY ध्वज, जैसे ...

$array = preg_split('/\s*\R\s*/', trim($text));

या दोनों प्रमुख व्हाट्सएप और खाली लाइनों को रखते हुए ...

$array = preg_split('/\s*\R/', rtrim($text));

मुझे कोई कारण नहीं दिखाई देता कि आप कभी व्हॉट्सएप को पीछे क्यों रखना चाहते हैं, इसलिए मेरा सुझाव है कि आप पहले \ _ * को वहां छोड़ दें। लेकिन, यदि आप चाहते हैं कि नई लाइन से विभाजित किया जाए (जैसा कि शीर्षक से पता चलता है), यह इस तरह से सरल है (जैसा कि जन गोएर्वाट्स ने उल्लेख किया है) ...

$array = preg_split('/\R/', $text);

mसंशोधक वास्तव में जरूरत नहीं है यह क्या है? यह केवल प्रभावित नहीं करता है ^और $?
मप्र

@ विजेता हां, मेरा मानना ​​है कि आप सही हैं। मैंने अभी इसे हेज़ेलबॉम के संस्करण के साथ किया। मैं अपनी पोस्ट संपादित करूँगा।
दीन फॉक्सक्स

7
<anti-answer>

जैसा कि अन्य उत्तरों ने निर्दिष्ट किया है, क्योंकि PHP 5.3.0 के रूप में पदावनत होने के explodeबजाय इसका उपयोग करना सुनिश्चित करें । अर्थात निम्नलिखित वह तरीका नहीं है जिससे आप इसे करना चाहते हैं:splitsplit

$your_array = split(chr(10), $your_string);

LF = "\ n" = chr (10), CR = "\ r" = chr (13)

</anti-answer>

3

किसी भी व्यक्ति को क्रॉन्स्टब में क्रोनोजर दिखाने की कोशिश करने और प्रत्येक पंक्ति को अलग करने के बारे में निराश होने के लिए, विस्फोट का उपयोग करें:

$output = shell_exec('crontab -l');
$cron_array = explode(chr(10),$output);

'\ n' का उपयोग करने से काम नहीं लगता है, लेकिन chr (10) अच्छी तरह से काम करता है: D

आशा है कि यह कुछ एक सिरदर्द को बचाता है।


हाय जेफ, एसओ में आपका स्वागत है। आपको इसे किसी और के प्रश्न पर उत्तर के बजाय एक प्रश्न और उत्तर के रूप में लिखना चाहिए। यह एक प्रश्नोत्तर साइट है, न कि सामान्य मंच। एफएक्यू पर एक नजर डालें - stackoverflow.com/faq
रेबेका स्कॉट

उपयोग करना '\n'काम नहीं करता है क्योंकि भागने के दृश्यों की व्याख्या एकल उद्धरणों में नहीं की जाती है, आपको इसके बजाय दोहरे उद्धरण चिह्नों का उपयोग करने की आवश्यकता है: "\n"इसके बजाय 'n'पढ़ें php.net/manual/en/language.types.string.php
क्रिस्टोफर के।


2

आप $ string = nl2br ($ string) कर सकते हैं ताकि आपकी लाइन ब्रेक बदल जाए

<br />. 

इस तरह यह कोई फर्क नहीं पड़ता कि सिस्टम \ r \ n या \ n या \ r का उपयोग करता है

तब आप इसे एक सरणी में खिला सकते हैं:

$array = explode("<br />", $string);

नोट: nl2br लाइन ब्रेक को प्रतिस्थापित नहीं करता है ... यह केवल प्रत्येक लाइन ब्रेक से पहले एक ब्रेक टैग सम्मिलित करता है। तो पहले के अलावा आपके सभी सरणी आइटम एक लाइन ब्रेक के साथ शुरू होंगे। यदि वह आपके लिए कोई मायने नहीं रखता है, तो यह विधि सबसे तेज़ है। अगर इससे कोई फर्क पड़ता है, तो जकार का जवाब सबसे तेज है।
ऑस्ट

2

यह मेरा तरीका है:

$lines = preg_split('/[\r\n]+/', $db_text, NULL, PREG_SPLIT_NO_EMPTY);

यह भी सभी खाली लाइनों को छोड़ देगा।


1
$str = "My text1\nMy text2\nMy text3";
$arr = explode("\n", $str);

foreach ($arr as $line_num => $line) {
    echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n";
}

सही सरणी:

$str = "My text1\nMy text2\nMy text3";
$arr = explode("\n", $str);

$array = array(); // inisiasi variable array in format array

foreach ($arr as $line) { // loop line by line and convert into array
    $array[] = $line;
};

print_r($array); // display all value

echo $array[1]; // diplay index 1

ऑनलाइन एम्बेड करें:

body, html, iframe { 
  width: 100% ;
  height: 100% ;
  overflow: hidden ;
}
<iframe src="https://ideone.com/vE1gst" ></iframe>


जवाब के साथ कुछ स्पष्टीकरण जोड़ें कि यह उत्तर ओपी को वर्तमान मुद्दे को ठीक करने में कैसे मदद करता है
ρяєρ withя K

1

इसे php डॉक्स में उठाया गया:

<?php
  // split the phrase by any number of commas or space characters,
  // which include " ", \r, \t, \n and \f

  $keywords = preg_split("/[\s,]+/", "hypertext language, programming");
  print_r($keywords);
?>

0

यह विधि हमेशा मेरे लिए काम करती है:

$uniquepattern="gd$#%@&~#"//Any set of characters which you dont expect to be present in user input $_POST['text'] better use atleast 32 charecters.
$textarray=explode($uniquepattern,str_replace("\r","",str_replace("\n",$uniquepattern,$_POST['text'])));

1
कोड के भाग के रूप में शपथ ग्रहण से प्यार करें। :) वैसे भी, \ n के साथ की जगह सरल है और साथ ही सुरक्षित है (अन्य उत्तरों को देखें)।
स्टीफन रीच

0

केवल 'आधार' पैकेज का उपयोग करना भी सरल मामलों के लिए एक समाधान है:

> s <- "a\nb\rc\r\nd"
> l <- strsplit(s,"\r\n|\n|\r")
> l  # the whole list...
[[1]]
[1] "a" "b" "c" "d"
> l[[1]][1] # ... or individual elements
[1] "a"
> l[[1]][2]
[1] "b"
> fun <- function(x) c('Line content:', x) # handle as you wish
> lapply(unlist(l), fun)

-6

\nPHP विस्फोट का उपयोग करके स्ट्रिंग या लाइन ब्रेक के बीच किसी विशेष चरित्र का उपयोग करके हम इसे प्राप्त कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.