如何将一个字符串分成多个部分
How to Separate a string to multiple parts
我有一些波斯语文本 (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"
}
]
}
您可以使用以下正则表达式:
'~\h*(?<term>[^:\n]*?)\s*:\s*(?<mean>(?:(?!\n\h*[^\n:]*:).)*)~us'
我正在使用命名的捕获组,以便您以后可以更轻松地访问它们。 请注意,您需要 /u
修饰符才能在 PHP 正则表达式中使用 Unicode 字符串!
正则表达式匹配:
\h*
- 0 个或更多水平空格
(?<term>[^:\n]*)
- 组 1 命名为 "term" 匹配 :
和 \n
[= 以外的 0 个或多个字符52=]
\s*:\s*
- 0 个或多个空格后跟 :
和零个或多个空格
(?<mean>(?:(?!\n\h*[^\n:]*:).)*)
- Group 2 named "mean" 匹配任何未开始的字符(因为我使用 /s
修饰符)像 spaces+term+:
这样的序列。这个 (?:(?!...).)*
结构被称为 tempered greedy token。您可以将其展开为 (?<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);
参见code demo。
这是一种更好的方法。
这行得通,但是您需要一个额外的步骤来修剪意思中的换行符。
只需坐在查找循环中。当你得到匹配时,只需 运行 这个替换
含义的内容 - 第 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. انواع انسان ها
برای خود خانه می سازند.
我有一些波斯语文本 (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"
}
]
}
您可以使用以下正则表达式:
'~\h*(?<term>[^:\n]*?)\s*:\s*(?<mean>(?:(?!\n\h*[^\n:]*:).)*)~us'
我正在使用命名的捕获组,以便您以后可以更轻松地访问它们。 请注意,您需要 /u
修饰符才能在 PHP 正则表达式中使用 Unicode 字符串!
正则表达式匹配:
\h*
- 0 个或更多水平空格(?<term>[^:\n]*)
- 组 1 命名为 "term" 匹配:
和\n
[= 以外的 0 个或多个字符52=]\s*:\s*
- 0 个或多个空格后跟:
和零个或多个空格(?<mean>(?:(?!\n\h*[^\n:]*:).)*)
- Group 2 named "mean" 匹配任何未开始的字符(因为我使用/s
修饰符)像 spaces+term+:
这样的序列。这个(?:(?!...).)*
结构被称为 tempered greedy token。您可以将其展开为(?<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);
参见code demo。
这是一种更好的方法。
这行得通,但是您需要一个额外的步骤来修剪意思中的换行符。
只需坐在查找循环中。当你得到匹配时,只需 运行 这个替换
含义的内容 - 第 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. انواع انسان ها
برای خود خانه می سازند.