【问题标题】:How to Separate a string to multiple parts如何将字符串分成多个部分
【发布时间】:2016-03-23 05:36:21
【问题描述】:

我有一些波斯文本(direction 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"
       }
      ]
}

【问题讨论】:

  • 你能解释一下你是如何推导出“单词”和“意思”的吗?如果你有 oen,一个英语例子会帮助我
  • @ExplosionPills 我加了一个英文例子。
  • Split 和正则表达式一样好。除非您有明确的要求,例如 word : 必须是换行符的第一个。
  • 你为什么不把2. 加入$str 呢?

标签: php regex explode


【解决方案1】:

您可以使用以下正则表达式:

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

regex demo

我正在使用命名的捕获组,以便您以后可以更轻松地访问它们。 请注意,您需要 /u 修饰符才能在 PHP 正则表达式中处理 Unicode 字符串!

正则表达式匹配:

  • \h* - 0 个或多个水平空格
  • (?&lt;term&gt;[^:\n]*) - 组 1 命名为“term”,匹配除 :\n 之外的 0 个或多个字符
  • \s*:\s* - 0 个或多个空格,后跟 : 和零个或多个空格
  • (?&lt;mean&gt;(?:(?!\n\h*[^\n:]*:).)*) - Group 2 命名为“mean”,匹配任何不以 spaces+ 开头的字符(因为我使用的是/s 修饰符)术语+:。这个(?:(?!...).)* 构造称为缓和贪婪令牌。您可以将其展开为 (?&lt;mean&gt;[^\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);

请参阅code demo

【讨论】:

    【解决方案2】:

    这是一个更好的方法。

    这行得通,但您有一个额外的步骤来修剪 含义中的换行符

    只需坐在查找循环中。当您找到匹配项时,只需在
    上运行此替换 含义的内容 - 第 2 组。
    然后将结果存储在一个数组中。

    查找:\s*\r?\n\s*
    替换:“”

    主正则表达式:

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

    Formatted and tested:

     (?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. انواع انسان ها
    برای خود خانه می سازند.   
    

    【讨论】:

    • 其实这是最好的方法!\
    猜你喜欢
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    相关资源
    最近更新 更多