Как разделить строку на несколько частей

У меня есть персидский текст (направление rlt) что я хочу их разделить.

Пример:

$str =" کامپیوتر : وسیله ی الکتریکی است 1.ماوس 2.کیبورد
       و مانیتور 3. کیس
چاپگر: وسیله ای است برای پرینت بر روی معمولا کاغذ
موبایل : نوعی تلفن است به صورت سیار و بی سیم
که جدیدا خیلی هم رایج شده است
و اکثر انسان ها دارند
خانه : محلی برای زندگی است. 1. حیوانات 2. انواع انسان ها
برای خود خانه می سازند. ";

Я хочу этот вывод:

{
    arr[
       {
         word: "کامپیوتر",
         mean: "وسیله ی الکتریکی است 1.ماوس 2.کیبورد و مانیتور 3. کیس"  
       },

       {
        word: "چاپگر",
        mean: "وسیله ای است برای پرینت بر روی معمولا کاغذ"
       },

       {
        word: "موبایل",
        mean: "نوعی تلفن است به صورت سیار و بی سیم که جدیدا خیلی هم رایج شده است و اکثر انسان ها دارند"
       },

       {
        word: "خانه",
        mean: "محلی برای زندگی است. 1. حیوانات 2. انواع انسان ها برای خود خانه می سازند."
       }
      ]
}

Ну, я думаю, что я не могу просто использовать explode(":", $str), Поскольку значение слова не является постоянным, оно иногда в нескольких строках. Я думаю, что мне нужно регулярное выражение. Так как я могу это сделать?


Изменить: пример на английском языке:

$str = "apple : it is a fruit
       computer : 1.an electronic device for storing and 
        processing data typically in binary form 2. according to
        instructionsgiven to it in a variable program"
        wall: a continuous vertical brick or stone structure
        that encloses or divides an area of land. 1. on the
       wall 2. brick wall 3. climbing wall";

Я хочу этот вывод:

{
    arr[
       {
         word: "apple",
         mean: "it is a fruit"  
       },

       {
        word: "computer",
        mean: "1.an electronic device for storing and processing data typically in binary form 2. according to instructionsgiven to it in a variable program"
       },

       {
        word: "wall",
        mean: "a continuous vertical brick or stone structure that encloses or divides an area of land. 1. on the wall 2. brick wall 3. climbing wall"
       }
      ]
}

2 ответа

Решение

Вы можете использовать следующее регулярное выражение:

'~\h*(?<term>[^:\n]*?)\s*:\s*(?<mean>(?:(?!\n\h*[^\n:]*:).)*)~us'

Посмотреть демо-версию регулярного выражения

Я использую именованные группы захвата, чтобы вы могли получить к ним доступ позже. Обратите внимание, что вам нужно /uмодификатор для работы со строками Unicode в регулярных выражениях PHP!

Соответствие регулярному выражению:

  • \h*- 0 или более горизонтальных пробелов
  • (?<term>[^:\n]*) - Группа 1 с именем "term" соответствует 0 или более символам, кроме:а также\n
  • \s*:\s*- 0 или более пробелов с последующим:и ноль или более пробелов
  • (?<mean>(?:(?!\n\h*[^\n:]*:).)*) - Группа 2 с именем "mean" соответствует любым символам (поскольку я использую/sмодификатор), которые не запускают последовательность, такую ​​какпробелы+термин + :, это(?:(?!...).)*конструкция называется закаленным жадным жетоном. Вы можете развернуть это как(?<mean>[^\n]*(?:\n(?!\h*[^\n:]*:)[^\n]*)*) для лучшей производительности (192 шага против 1226).

Используйте регулярное выражение с preg_match_all а не с preg_replace так как вам нужен массив:

$str =" کامپیوتر : وسیله ی الکتریکی است 1.ماوس 2.کیبورد
       و مانیتور 3. کیس
چاپگر: وسیله ای است برای پرینت بر روی معمولا کاغذ
موبایل : نوعی تلفن است به صورت سیار و بی سیم
که جدیدا خیلی هم رایج شده است
و اکثر انسان ها دارند
خانه : محلی برای زندگی است. 1. حیوانات 2. انواع انسان ها
برای خود خانه می سازند. ";
preg_match_all('~\h*(?<term>[^:\n]*?)\s*:\s*(?<mean>(?:(?!\n\h*[^\n:]*:).)*)~us', $str, $m, PREG_SET_ORDER);
print_r($m);

Смотрите код демо.

Это лучший способ сделать это.

Это работает, но у вас есть дополнительный шаг, чтобы сделать обрезку новых строк по смыслу.

Просто сидеть в петле поиска. Когда вы получите совпадение, просто запустите эту замену на
Содержание смысла - группа 2.
Затем просто сохраните результаты в массиве.

Найти: \s*\r?\n\s*
Заменить: " "

Основное регулярное выражение:

(?m)^\h*([^:\r\n]*?)\h*:(.*(?:\s*^(?!\h*[^:\r\n]*?\h*:).*)*)

Отформатирован и протестирован:

 (?m)
 ^ 
 \h* 
 ( [^:\r\n]*? )                # (1) Word
 \h* :
 (                             # (2 start) Meaning
      .*  
      (?:
           \s* 
           ^          
           (?!
                \h* [^:\r\n]*? \h* :
           )
           .* 
      )*
 )                             # (2 end)

Выход:

 **  Grp 1 -  ( pos 1 , len 8 ) 
کامپیوتر  
 **  Grp 2 -  ( pos 11 , len 62 ) 
 وسیله ی الکتریکی است 1.ماوس 2.کیبورد
       و مانیتور 3. کیس  

---------------------

 **  Grp 1 -  ( pos 75 , len 5 ) 
چاپگر  
 **  Grp 2 -  ( pos 81 , len 43 ) 
 وسیله ای است برای پرینت بر روی معمولا کاغذ  

---------------------

 **  Grp 1 -  ( pos 126 , len 6 ) 
موبایل  
 **  Grp 2 -  ( pos 134 , len 90 ) 
 نوعی تلفن است به صورت سیار و بی سیم
که جدیدا خیلی هم رایج شده است
و اکثر انسان ها دارند  

---------------------

 **  Grp 1 -  ( pos 226 , len 4 ) 
خانه  
 **  Grp 2 -  ( pos 232 , len 76 ) 
 محلی برای زندگی است. 1. حیوانات 2. انواع انسان ها
برای خود خانه می سازند.   
Другие вопросы по тегам