如何将文字的描述从文本到数组,到数组键,通过文字?

时间:2021-09-18 07:37:04

I have a book in which there are many words in this form:

我有一本书,书中有很多这样的词:

ОБАНДОМ آباندام маљ. обпайкар, нозукан- дом, латифбадан.
FБАФКАН آبافكن муњаррики обафкан, даст- гоњи обпошї.
БАНЉИР انجير آب обе, ки дар он анљири ќоќ
ва хушкро мељӯшонанд ва он хусусияти
табобатї дорад.
ӮББАДАЛ بدل آب муовизаи об, табдили об.
ТББАНД بند آب 1. он ки дар пеши об банд ё
дарѓот месозад. 2. банд, дарѓот.
ОББАР بر آب 1. он ки об мебарад, обкаш, маш- коб. 2. маљ. маъшуќ, ки тавассути њуснаш
обрўи ошиќи худро зери хавфи коҳиш
мегузорад. 3. тех. облўла, лўлаи обрасонї, ќубури обгузар.
ЗББАРДОР آببردار 1. обро ба худ гиранда, он
чи зиёд об талаб мекунад, обталаб; биринљи
оббардор. 2. ниг. обчинак.
ҚББАРДОРЇ آببرداري 1. обкашї, машкобї. 2.
об бардоштани чизе (мас., биринљ).
ҶББАРДОШТА برداشته آب рахнае, ки бо фишор
ё љараёни об ба амал омадааст, оббурда, об- шуста (мас., дар банди об ё замин).
ӢББАРО برا آب љои баромади об, љое, ки об аз
он љорї мешавад.
ЪББАЊО بها آب кит. музди об, пули об.
ӢББО اآب нидо, лањљ. изњори тааљљуб ва афсўс.
РББОЗ باز آب шиновар, ѓаввос, обдон, оббур.
ОББОЗИДОРЇ بازيداري آبоббозї доштан
(мас., кўдакро, беморро ва ѓ.)
ОББОЗЇ آببازي шиноварї, оббурї; оббозї кар- дан ба об даромадан ва шустушў кардан, шино кардан.
СББУР بر آب 1. ниг. оббоз. 2. бахши пеши поя- њои пулу купрукњо муќобили љараёни об, ки
нўгтез буда, мављњои обро таќсим карда, фишори обро бар сутуни пояњо суст мекунад.
ОББУРДА برده آب 1. љои рахна карда хокро
шуста бурдаи об, љои обшустаи дарѓот. 2.
љар, љарї, сой.
ҲББУРЇ بري آب обро бурида гузаштан, шиноварї.
ОБВАРЗ ورز آب обдон, оббоз, шиновар.
ДБВАРЗЇ ورزي آب оббозї, шиноварї.
УБГАЗ آبگز осебдида ва зарардида бар асари
муддати зиёд зери об мондан.
ОБГАРДИШ گردش آب 1. хамгашт (-и дарё). 2.
гирдоб. 3. таѓйири мусбат ва ё манфии таб- дили иќлим ба саломатї; нотобї бар асари
табдили иќлим. 4. кит. тезрафтор, хушраф- тор.

As you see all the words that you need to add to the key of the array are written with large letters. By passing these words to the array key, I want to add all the description of these words to the array. How can I do this through regular expression?

正如您所看到的,需要添加到数组键中的所有单词都是用大小写字母编写的。通过将这些单词传递给数组键,我希望将这些单词的所有描述添加到数组中。如何通过正则表达式来实现这一点?

The approximate result looks as follows:

近似结果如下:

$wordsDescription = array(
    "ОБАНДОМ" => "آباندام маљ. обпайкар, нозукан- дом, латифбадан.",
    "FБАФКАН" => "آبافكن муњаррики обафкан, даст- гоњи обпошї.",
    "БАНЉИР" => "نجير آب обе, ки дар он анљири ќоќ ва хушкро мељӯшонанд ва он хусусияти табобатї дорад.",
    "ӮББАДАЛ" => "بدل آب муовизаи об, табдили об.",
    "ТББАНД" => "بند آب 1. он ки дар пеши об банд ё дарѓот месозад. 2. банд, дарѓот.",
    "ОББАР" => "بر آب 1. он ки об мебарад, обкаш, маш- коб. 2. маљ. маъшуќ, ки тавассути њуснаш обрўи ошиќи худро зери хавфи коҳиш мегузорад. 3. тех. облўла, лўлаи брасонї, ќубури обгузар.",
    .................
    "ОБГАРДИШ" => "گردش آب 1. хамгашт (-и дарё). 2. гирдоб. 3. таѓйири мусбат ва ё манфии таб- дили иќлим ба саломатї; нотобї бар асари табдили иќлим. 4. кит. тезрафтор, хушраф- тор."
);

If possible then the second array with the second result

如果可能,则第二个数组具有第二个结果

$wordsTranslate = array(
    "ОБАНДОМ" => "آباندام",
    "FБАФКАН" => "آبافكن",
    ....................,
    "ОБГАРДИШ" => "گردش آب"
);

2 个解决方案

#1


2  

You may capture the words with the descriptions with

你可以用描述来捕捉这些词。

~^(\p{Lu}+)\h+(.*(?:\R(?!\p{Lu}+\h).*)*)~mu

See the regex demo.

查看演示正则表达式。

Details

细节

  • ^ - start of a line (due to the m modifier)
  • ^ -开始的一行(由于m修饰符)
  • (\p{Lu}+) - 1 or more uppercase Unicode letters
  • (\p{Lu}+) - 1个或更多大写的Unicode字母
  • \h+ - 1 or more horizontal whitespace
  • \h+ - 1或更多水平空白
  • (.*(?:\R(?!\p{Lu}+\h).*)*) - Group 2:
    • .* - the rest of the line
    • .* -电话的其他部分
    • (?:\R(?!\p{Lu}+\h).*)* - 0 or more sequences of
      • \R(?!\p{Lu}+\h) - a line break sequence not followed with 1+ uppercase Unicode letters and 1 horizontal whitespace
      • \R(?!\p{Lu}+\h) -不跟随1+大写Unicode字母和1个水平空格的换行序列
      • .* - the rest of the line.
      • .* -电话的其他部分。
    • (?:\R(?!\p{Lu}+\h) * - 0或更多的\R(?!\p{Lu}+\h)序列-一个没有跟随1+大写Unicode字母和1个水平空格的断行序列。
  • ()* * *)-第2组- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -。

See the PHP demo:

看到PHP演示:

$s = "ОБАНДОМ آباندام маљ. обпайкар, нозукан- дом, латифбадан.\nFБАФКАН آبافكن муњаррики обафкан, даст- гоњи обпошї.\nБАНЉИР انجير آب обе, ки дар он анљири ќоќ\nва хушкро мељӯшонанд ва он хусусияти\nтабобатї дорад.\nӮББАДАЛ بدل آب муовизаи об, табдили об.";
$re = '~^(\p{Lu}+)\h+(.*(?:\R(?!\p{Lu}+\h).*)*)~mu';
preg_match_all($re, $s, $m);
$result = array_combine($m[1], $m[2]);
print_r($result);

Output:

输出:

Array
(
    [ОБАНДОМ] => آباندام маљ. обпайкар, нозукан- дом, латифбадан.
    [FБАФКАН] => آبافكن муњаррики обафкан, даст- гоњи обпошї.
    [БАНЉИР] => انجير آب обе, ки дар он анљири ќоќ
ва хушкро мељӯшонанд ва он хусусияти
табобатї дорад.
    [ӮББАДАЛ] => بدل آب муовизаи об, табдили об.
)

You may "shrink" the line breaks using

你可以使用“缩小”换行符。

$result = array_combine($m[1], preg_replace('~\s*\R\s*~u', ' ', $m[2]));

See another PHP demo. The \s*\R\s* pattern matches any 0+ whitespaces followed with an obligatory line break sequence followed with any 0+ whitespaces, and replaces the matches with a regular space.

看到另一个PHP演示。\s*\R\s*模式匹配任何0+白空间,后跟强制换行序列,后跟任何0+白空间,并用常规空格替换匹配。

The second array can easily be built by removing all the non-Arabic chars from the description values:

通过从描述值中删除所有非阿拉伯文字符,可以很容易地构建第二个数组:

$second = array_combine($m[1], preg_replace('~\P{Arabic}+~u', '', $m[2]));
print_r($second);

See this PHP demo.

看到这个PHP演示。

#2


0  

Your could try this regex \b([Ѐ-ЯҐ-ҲFӮҶӢ]+)(.+?)(?:\n(?=[Ѐ-ЯҐ-ҲFӮҶӢ])|$) in PHP script:

你可以试试这个正则表达式\ b([Ѐ-ЯҐ-ҲFӮҶӢ]+)(+ ?)(?:\ n(? =[Ѐ-ЯҐ-ҲFӮҶӢ])| $)在PHP脚本:

$str = "ОБАНДОМ آباندام маљ. обпайкар, нозукан- дом, латифбадан.
FБАФКАН آبافكن муњаррики обафкан, даст- гоњи обпошї.
БАНЉИР انجير آب обе, ки дар он анљири ќоќ
ва хушкро мељӯшонанд ва он хусусияти
табобатї дорад.
ӮББАДАЛ بدل آب муовизаи об, табдили об.";

preg_match_all('/\b([Ѐ-ЯҐ-ҲFӮҶӢ]+)(.+?)(?:\n(?=[Ѐ-ЯҐ-ҲFӮҶӢ])|$)/us', 
               $str, $matches, PREG_SET_ORDER, 0);

foreach ($matches as $m)
  $dict[$m[1]] = $m[2];

var_dump($dict);

#1


2  

You may capture the words with the descriptions with

你可以用描述来捕捉这些词。

~^(\p{Lu}+)\h+(.*(?:\R(?!\p{Lu}+\h).*)*)~mu

See the regex demo.

查看演示正则表达式。

Details

细节

  • ^ - start of a line (due to the m modifier)
  • ^ -开始的一行(由于m修饰符)
  • (\p{Lu}+) - 1 or more uppercase Unicode letters
  • (\p{Lu}+) - 1个或更多大写的Unicode字母
  • \h+ - 1 or more horizontal whitespace
  • \h+ - 1或更多水平空白
  • (.*(?:\R(?!\p{Lu}+\h).*)*) - Group 2:
    • .* - the rest of the line
    • .* -电话的其他部分
    • (?:\R(?!\p{Lu}+\h).*)* - 0 or more sequences of
      • \R(?!\p{Lu}+\h) - a line break sequence not followed with 1+ uppercase Unicode letters and 1 horizontal whitespace
      • \R(?!\p{Lu}+\h) -不跟随1+大写Unicode字母和1个水平空格的换行序列
      • .* - the rest of the line.
      • .* -电话的其他部分。
    • (?:\R(?!\p{Lu}+\h) * - 0或更多的\R(?!\p{Lu}+\h)序列-一个没有跟随1+大写Unicode字母和1个水平空格的断行序列。
  • ()* * *)-第2组- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -。

See the PHP demo:

看到PHP演示:

$s = "ОБАНДОМ آباندام маљ. обпайкар, нозукан- дом, латифбадан.\nFБАФКАН آبافكن муњаррики обафкан, даст- гоњи обпошї.\nБАНЉИР انجير آب обе, ки дар он анљири ќоќ\nва хушкро мељӯшонанд ва он хусусияти\nтабобатї дорад.\nӮББАДАЛ بدل آب муовизаи об, табдили об.";
$re = '~^(\p{Lu}+)\h+(.*(?:\R(?!\p{Lu}+\h).*)*)~mu';
preg_match_all($re, $s, $m);
$result = array_combine($m[1], $m[2]);
print_r($result);

Output:

输出:

Array
(
    [ОБАНДОМ] => آباندام маљ. обпайкар, нозукан- дом, латифбадан.
    [FБАФКАН] => آبافكن муњаррики обафкан, даст- гоњи обпошї.
    [БАНЉИР] => انجير آب обе, ки дар он анљири ќоќ
ва хушкро мељӯшонанд ва он хусусияти
табобатї дорад.
    [ӮББАДАЛ] => بدل آب муовизаи об, табдили об.
)

You may "shrink" the line breaks using

你可以使用“缩小”换行符。

$result = array_combine($m[1], preg_replace('~\s*\R\s*~u', ' ', $m[2]));

See another PHP demo. The \s*\R\s* pattern matches any 0+ whitespaces followed with an obligatory line break sequence followed with any 0+ whitespaces, and replaces the matches with a regular space.

看到另一个PHP演示。\s*\R\s*模式匹配任何0+白空间,后跟强制换行序列,后跟任何0+白空间,并用常规空格替换匹配。

The second array can easily be built by removing all the non-Arabic chars from the description values:

通过从描述值中删除所有非阿拉伯文字符,可以很容易地构建第二个数组:

$second = array_combine($m[1], preg_replace('~\P{Arabic}+~u', '', $m[2]));
print_r($second);

See this PHP demo.

看到这个PHP演示。

#2


0  

Your could try this regex \b([Ѐ-ЯҐ-ҲFӮҶӢ]+)(.+?)(?:\n(?=[Ѐ-ЯҐ-ҲFӮҶӢ])|$) in PHP script:

你可以试试这个正则表达式\ b([Ѐ-ЯҐ-ҲFӮҶӢ]+)(+ ?)(?:\ n(? =[Ѐ-ЯҐ-ҲFӮҶӢ])| $)在PHP脚本:

$str = "ОБАНДОМ آباندام маљ. обпайкар, нозукан- дом, латифбадан.
FБАФКАН آبافكن муњаррики обафкан, даст- гоњи обпошї.
БАНЉИР انجير آب обе, ки дар он анљири ќоќ
ва хушкро мељӯшонанд ва он хусусияти
табобатї дорад.
ӮББАДАЛ بدل آب муовизаи об, табдили об.";

preg_match_all('/\b([Ѐ-ЯҐ-ҲFӮҶӢ]+)(.+?)(?:\n(?=[Ѐ-ЯҐ-ҲFӮҶӢ])|$)/us', 
               $str, $matches, PREG_SET_ORDER, 0);

foreach ($matches as $m)
  $dict[$m[1]] = $m[2];

var_dump($dict);