Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何编写从文本中获取具有描述的组合词的模式?_Php_Regex_Utf 8 - Fatal编程技术网

Php 如何编写从文本中获取具有描述的组合词的模式?

Php 如何编写从文本中获取具有描述的组合词的模式?,php,regex,utf-8,Php,Regex,Utf 8,我提供了示例文本: $text = " АДАБГОЊ љои адаб- омўзї. АДАБДОН ادبدان ошно бо адабу фарњанг. тиллову нуќра бо мањак ва ѓ.; зар(р)и иёр тил- лои холис. АЁРА اياره 1. ёра, дастбиранљан. "; 我有一个示例代码,用于将大写单词放到数组键和数组值中,即大写单词的所有文本右侧: $regex = '~\b-(?:\R|\h)\b~u'; $

我提供了示例文本:

$text = "
АДАБГОЊ љои адаб-
омўзї.
АДАБДОН ادبدان ошно бо адабу фарњанг.
тиллову нуќра бо мањак ва ѓ.; зар(р)и иёр тил-
лои холис.
АЁРА اياره 1. ёра, дастбиранљан.
";
我有一个示例代码,用于将大写单词放到数组键和数组值中,即大写单词的所有文本右侧:

$regex = '~\b-(?:\R|\h)\b~u';
$text = preg_replace($regex, '', $text);
$pattern = '~^(\p{Lu}+)\h+(.*(?:\R(?!\p{Lu}+\h).*)*)~mu';
preg_match_all($pattern, $text, $matches);
$result = array_combine(array_map('mb_strtolower', $matches[1]), preg_replace('~\s*\R++\s*~u', ' ', preg_replace('~\p{Arabic}+~u', '', $matches[2])));
echo "<pre>";
print_r($result);
echo "</pre>";
但我有第二种文本,我有问题:

Array
(
    [адабдон] =>  ошно бо адабу фарњанг. АЁЃ//АЁЌ т. // кит. пиёла, ќадањ, соѓар. АЁР//ИЁР а.  санљидани дараљаи холисияти тиллову нуќра бо мањак ва ѓ.; зар(р)и иёр тиллои холис. 
    [аёра] =>  1. ёра, дастбиранљан. АДУ//АДУВ а.  ниг. адў. 
)
在这种类型的文本中,我有带符号的单词
/
。这种类型的单词有两个单词和一个描述。(单词//单词描述)。当我使用旧代码时,结果将是:

Array
(
    [адабдон] =>  ошно бо адабу фарњанг. 
    [аёѓ] => т. // кит. пиёла, ќадањ, соѓар. 
    [аёк] => т. // кит. пиёла, ќадањ, соѓар.
    [аёр] => а.  санљидани дараљаи холисияти тиллову нуќра бо мањак ва ѓ.; зар(р)и иёр тиллои холис. 
    [иёр] => а.  санљидани дараљаи холисияти тиллову нуќра бо мањак ва ѓ.; зар(р)и иёр тиллои холис. 
    [аёра] =>  1. ёра, дастбиранљан.
    [аду] =>  а.  ниг. адў. 
    [адув] =>  а.  ниг. адў. 
)
如何编写模式以获得示例结果:

$text = "
АДАБГОЊ//АДАБГАЊ ادبگه//ادبگاه љои адаб-
омўзї.
АДАБДОН ادبدان ошно бо адабу фарњанг.
АЁЃ//АЁЌ т. اياق//اياغ кит. пиёла, ќадањ, соѓар.
АЁР//ИЁР а. ايار санљидани дараљаи холисияти
тиллову нуќра бо мањак ва ѓ.; зар(р)и иёр тил-
лои холис.
АЁРА اياره 1. ёра, дастбиранљан.
АДУ//АДУВ а. عدو ниг. адў.
";

$defs = preg_split('~^(\p{Lu}+(?://\p{Lu}+)*)\h+~mu', trim($text), -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

$result = [];
while ( false !== $items = current($defs) ) {
    $def = trim(preg_replace('~(?:\s*\p{Arabic}+(?://\p{Arabic}+)*)?\s+~u', ' ', next($defs)));
    foreach (explode('//', $items) as $item) {
        $result[$item] = $def;
    }
    next($defs);
}

print_r($result);

以下是所有带有
/
符号的单词的一个描述。

使用
预拆分的方式:

class NormalizeFilter extends php_user_filter
{
    public function filter($in, $out, &$consumed, $closing)
    {
        while ($bucket = stream_bucket_make_writeable($in)) {
            $bucket->data = preg_replace('~\s+\p{Arabic}*(?://\p{Arabic}+)*\s*(?!^\p{Lu})~mu', ' ', $bucket->data);
            $consumed += $bucket->datalen;
            stream_bucket_append($out, $bucket);
        }
        return PSFS_PASS_ON;
    }
}

stream_filter_register("norm", "NormalizeFilter")
    or die("Failed to register filter");

function genDefs($fh, $bufferSize = 1024) {
    while ( false !== $line = fgets($fh, $bufferSize) ) {
        if ( preg_match('~^(\p{Lu}+(?://\p{Lu}+)*) \K.*\S~u', $line, $m) ) {
            foreach ( explode('//', $m[1]) as $item ) {
                yield $item => $m[0];
            }
        }
    }
}

$fh = fopen('php://filter/read=norm/resource=file:///path/to/file.txt', 'r');

$defs = genDefs($fh);

foreach ($defs as $item => $definition) {
    echo "$item: $definition\n";
}


建议:如果文本来自一个非常大的文件,并且您不需要将整个数组存储在内存中,您可以使用用户定义的流过滤器重写此代码,并最终使用生成键和值的生成器(
yield$key=>$value;
)来节省内存,例如:



您从未解释过要做什么,请使用英文示例输入。请发布您的工作代码,并提供指向的链接,以便有一个改进的起点。我不在php中使用生成器。你能给我看一下收益率生成器的示例代码吗?我有13mb大小的文件。我必须用它来测试代码。如果可能的话,给我举个例子,在这个任务中使用yield。@Otabek:我添加了一个例子。
$text = "
АДАБГОЊ//АДАБГАЊ ادبگه//ادبگاه љои адаб-
омўзї.
АДАБДОН ادبدان ошно бо адабу фарњанг.
АЁЃ//АЁЌ т. اياق//اياغ кит. пиёла, ќадањ, соѓар.
АЁР//ИЁР а. ايار санљидани дараљаи холисияти
тиллову нуќра бо мањак ва ѓ.; зар(р)и иёр тил-
лои холис.
АЁРА اياره 1. ёра, дастбиранљан.
АДУ//АДУВ а. عدو ниг. адў.
";

$defs = preg_split('~^(\p{Lu}+(?://\p{Lu}+)*)\h+~mu', trim($text), -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

$result = [];
while ( false !== $items = current($defs) ) {
    $def = trim(preg_replace('~(?:\s*\p{Arabic}+(?://\p{Arabic}+)*)?\s+~u', ' ', next($defs)));
    foreach (explode('//', $items) as $item) {
        $result[$item] = $def;
    }
    next($defs);
}

print_r($result);
class NormalizeFilter extends php_user_filter
{
    public function filter($in, $out, &$consumed, $closing)
    {
        while ($bucket = stream_bucket_make_writeable($in)) {
            $bucket->data = preg_replace('~\s+\p{Arabic}*(?://\p{Arabic}+)*\s*(?!^\p{Lu})~mu', ' ', $bucket->data);
            $consumed += $bucket->datalen;
            stream_bucket_append($out, $bucket);
        }
        return PSFS_PASS_ON;
    }
}

stream_filter_register("norm", "NormalizeFilter")
    or die("Failed to register filter");

function genDefs($fh, $bufferSize = 1024) {
    while ( false !== $line = fgets($fh, $bufferSize) ) {
        if ( preg_match('~^(\p{Lu}+(?://\p{Lu}+)*) \K.*\S~u', $line, $m) ) {
            foreach ( explode('//', $m[1]) as $item ) {
                yield $item => $m[0];
            }
        }
    }
}

$fh = fopen('php://filter/read=norm/resource=file:///path/to/file.txt', 'r');

$defs = genDefs($fh);

foreach ($defs as $item => $definition) {
    echo "$item: $definition\n";
}