كيفية وضع السلسلة في مجموعة، مقسمة على سطر جديد؟

StackOverflow https://stackoverflow.com/questions/1483497

  •  18-09-2019
  •  | 
  •  

سؤال

لدي سلسلة مع فواصل الأسطر في قاعدة البيانات الخاصة بي.أريد تحويل هذه السلسلة إلى مصفوفة، ولكل سطر جديد، انتقل إلى مكان فهرس واحد في المصفوفة.

إذا كانت السلسلة هي:

النص الخاص بي1
النص الخاص بي2
النص الخاص بي3

والنتيجة التي أريدها هي:

Array
(
    [0] => My text1
    [1] => My text2
    [2] => My text3
)
هل كانت مفيدة؟

المحلول

يمكنك استعمال ال 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 يتم تفسيره فعلا ككسر خط.
(انظر تلك الصفحة اليدوية لمزيد من التفاصيل)

نصائح أخرى

لقد استخدمت هذا دائما بنجاح كبير:

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

(تحديث مع النهائي R، شكرا Lobsterman)

يتم تعريف كسر الخط بشكل مختلف على منصات مختلفة، r n، r أو n.

باستخدام Regoxp لتقسيم السلسلة التي يمكنك مطابقة الكل ثلاثة مع r

لذلك لمشكلتك:

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

من شأنه أن يتطابق مع فواصل الأسطر على Windows و Mac و Linux!

يعرف PHP بالفعل حرف (أحرف) النظام الجديد في النظام الحالي. مجرد استخدام ثابت EOL.

explode(PHP_EOL,$string)

بديل ل إجابة ديفيدز وهو أسرع (بطريقة أسرع) للاستخدام str_replace و explode.

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

ما يحدث هو:
نظرًا لأن فواصل الأسطر يمكن أن تأتي بأشكال مختلفة، فأنا str_replace و و مع بدلاً من ذلك (ويتم الاحتفاظ الأصلي).
ثم تنفجر \n ولديك كافة الخطوط في مجموعة.

لقد قمت بإجراء اختبار مرجعي على src لهذه الصفحة وقمت بتقسيم الأسطر 1000 مرة في حلقة for و:
preg_replace استغرق متوسط ​​11 ثانية
str_replace & explode استغرق متوسط ​​حوالي 1 ثانية

مزيد من التفاصيل والمعلومات المرجعية على المنتدى الخاص بي

ديفيد: اتجاه رائع، لكنك فاتتك ص. هذا عملت بالنسبة لي:

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

"(بدلا من") أمر مهم للغاية كما خلاف ذلك، فاصل الخط لا يتم تفسيره.

لا تحتاج إلى وظائف Preg_ * أو أنماط Preg ولا str_replace داخلها، إلخ. في جميع السيناريوهات، سواء كانت Linux / Mac أو M $، فسيفعل ذلك.

<?php 

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

?>

php_eol. هو ثابت عقد حرف (حرف) كسر الخط المستخدمة من خلال منصة الخادم.

لن يسمح لي Stackoverflow بالتعليق على إجابة Hesselbom (وليس سمعة كافية)، لذلك أنا أضيف بلدي ...

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

لقد عمل ذلك بشكل أفضل بالنسبة لي لأنه يزيل أيضا براد (Second S *) وضائدة (First s *) Whitespace تلقائيا وأيضا يتخطى خطوط فارغة (العلم preg_split_no_pery).

- = خيارات = -

إذا كنت ترغب في الاحتفاظ بأي مسافة بيضاء، فما عليك سوى التخلص من s * s * وجعلها Rtrim () بدلا من ذلك ...

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

إذا كنت بحاجة إلى الاحتفاظ بخطوط فارغة، فالتخلص من NULL (ليس فقط عنصر نائب) وعلم preg_split_no_mepty، مثل ...

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

أو الحفاظ على كل من بيض المسافة البسيطة وخطوط فارغة ...

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

لا أرى أي سبب لماذا تريد أن تبقي على الإبقاء على مسافة بيضاء، لذلك أقترح ترك S الأولى في هناك. ولكن، إذا كان كل ما تريده هو الانقسام من قبل خط جديد (كما يوحي العنوان)، فهذا هو بسيط (كما ذكر من جان جوانفايرز) ...

$array = preg_split('/\R/', $text);
<anti-answer>

كما حددت الإجابات الأخرى، تأكد من استخدامها explode بدلا من split لأنه اعتبارا من PHP 5.3.0 split مهملة. أي ما يلي هو ليس الطريقة التي تريد القيام بها:

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

LF = " n" = chr (10)، cr = " r" = chr (13)

</anti-answer>

لأي شخص يحاول عرض Cronjobs في Crontab والحصول على الإحباط حول كيفية فصل كل سطر، استخدم Explode:

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

باستخدام " N" لا يبدو أن يعمل ولكن Chr (10) يعمل بشكل جيد: D

آمل أن يحفظ هذا بعض الصداع.

يمكنك استخدام هذا:

 \str_getcsv($str,PHP_EOL);

يمكنك القيام بسلسلة $ = NL2BR (سلسلة $) بحيث يتم تغيير استراحة خطك إلى

<br />. 

بهذه الطريقة لا يهم إذا كان النظام يستخدم r n أو n أو r

ثم يمكنك إطعامها في صفيف:

$array = explode("<br />", $string);
$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>

اختار هذا في مستندات 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);
?>

هذه الطريقة تعمل دائما بالنسبة لي:

$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'])));

باستخدام حزمة "الأساس" فقط هي أيضا حل للحالات البسيطة:

> 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)

هذا طريقي:

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

هذا أيضا سوف تخطي جميع الخطوط الفارغة أيضا.

باستخدام أي حرف خاص بين السلسلة أو استراحة السطر \n باستخدام PHP ينفجر يمكننا تحقيق ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top