在限定包含日语字符的子字符串之前分割字符串

问题描述 投票:0回答:5

我怎样才能分割这条线:

我 [wǒ] - (pronoun) I or me 你 [nǐ] - (pronoun) you (second person singular); yourself 他 [tā] - (pronoun) he or him

分成三行,如下所示:

我 [wǒ] - (pronoun) I or me

你 [nǐ] - (pronoun) you (second person singular); yourself

他 [tā] - (pronoun) he or him

最终,我计划在每行后面插入一个

<br />
标签。

php unicode split cjk delimited
5个回答
2
投票

自从你删除这些点以来,我们能看到的唯一清晰的模式是“一个外来字符、一个空格和一个左括号”。

让我们重点关注:

<?php

$string = "我 [wǒ] - (pronoun) I or me 你 [nǐ] - (pronoun) you (second person singular); yourself 他 [tā] - (pronoun) he or him";

$result = preg_replace('/(. \[)/u', // "any char, a space then [", 'u' flag to use UTF8 
                       '<br/>$1', // replace it by a break table and a back reference
                        $string);

echo $result;

请注意,使用此算法,换行符将放置在行的开头。 不要忘记 UTF-8 标志,并在应用程序中的任何地方使用 UTF-8,否则处理字符串将会变得一团糟。

编辑:如果您希望换行符仅位于两行的开头,那么您可以使用负向后查找来实现此目的:

$string = "我 [wǒ] - (pronoun) I or me 你 [nǐ] - (pronoun) you (second person singular); yourself 他 [tā] - (pronoun) he or him";

// the same pattern, but excluding the one preceded by "^", where the string starts
$result = preg_replace('/(?<!^)(. \[)/u',   
                       '<br/>$1', 
                        $string);

echo $result;

0
投票

如果您确定格式,您可以尝试类似的操作,但是如果没有正确的分隔符,一切都只是猜测,您可能会得到不正确的转换。

$str = preg_replace("/\s+(\S+\s+\[\S+\])/", "<br />$1", $str);

0
投票

如果我的解释是正确的,你想在每个中文/日文字符之前中断吗?

在 php 手册中,ord 函数的注释中有许多关于 UTF-8 ord 函数的建议/代码。 使用这样的函数,您可以通过字符串逐个 UTF-8 代码点迭代 UTF-8 代码点,如果您遇到一个代码点(字符),其 ord 是 > 中文/日文字符的开头,请首先插入
或其他内容。

编辑:ord 的文档页面是

这里

这是我认为可能适合您的问题的代码:引用 shetline dot com 的作者 kerry

这是我对之前发布的一篇文章的看法 UTF-8版本的ord,适用于 按 Unicode 迭代字符串 价值。该功能可以选择 将索引放入字符串中,并且 可选择返回字节数 被一个角色消耗,这样你 知道索引增加多少 到达下一个角色。

<?php function ordUTF8($c, $index = 0, &$bytes = null) { $len = strlen($c); $bytes = 0; if ($index >= $len) return false; $h = ord($c{$index}); if ($h <= 0x7F) { $bytes = 1; return $h; } else if ($h < 0xC2) return false; else if ($h <= 0xDF && $index < $len - 1) { $bytes = 2; return ($h & 0x1F) << 6 | (ord($c{$index + 1}) & 0x3F); } else if ($h <= 0xEF && $index < $len - 2) { $bytes = 3; return ($h & 0x0F) << 12 | (ord($c{$index + 1}) & 0x3F) << 6 | (ord($c{$index + 2}) & 0x3F); } else if ($h <= 0xF4 && $index < $len - 3) { $bytes = 4; return ($h & 0x0F) << 18 | (ord($c{$index + 1}) & 0x3F) << 12 | (ord($c{$index + 2}) & 0x3F) << 6 | (ord($c{$index + 3}) & 0x3F); } else return false; } ?>
    

0
投票
<?php $str="我 [wǒ] - (pronoun) I or me 你 [nǐ] - (pronoun) you (second person singular); yourself 他 [tā] - (pronoun) he or him"; $splitPoints; $indis=0; for($i=0;$i<strlen($str);$i++){ if ($str[$i]=='['){ $splitPoints[$indis]=$i-4; $indis++; } } for($i=0;$i<$indis-1;$i++){ $strArray[$i]=substr($str,$splitPoints[$i],($splitPoints[$i+1]-$splitPoints[$i])); } $strArray[$i]=substr($str,$splitPoints[$indis-1],(strlen($str)-$splitPoints[$indis-1])); for($i=0;$i<$indis;$i++){ echo $strArray[$i]."<br>"; } ?>
    

0
投票
我将演示两种模式(直观地命名的日语范围和不直观的范围)以及如何分割字符串或更直接地用

<br />

 替换不需要的分隔空格。

代码:(

演示

$text = '我 [wǒ] - (pronoun) I or me 你 [nǐ] - (pronoun) you (second person singular); yourself 他 [tā] - (pronoun) he or him';

  • 不直观的范围:

    var_export( preg_split('/(?=[一-龠ぁ-ゔァ-ヴー々〆〤] \[)/u', $text, flags:PREG_SPLIT_NO_EMPTY) );
    输出:

    array ( 0 => '我 [wǒ] - (pronoun) I or me ', 1 => '你 [nǐ] - (pronoun) you (second person singular); yourself ', 2 => '他 [tā] - (pronoun) he or him', )
    
    

  • 直观的分割:

    var_export( preg_split('/(?=[\p{Katakana}\p{Hiragana}\p{Han}] \[)/u', $text, flags:PREG_SPLIT_NO_EMPTY) );
    输出:

    array ( 0 => '我 [wǒ] - (pronoun) I or me ', 1 => '你 [nǐ] - (pronoun) you (second person singular); yourself ', 2 => '他 [tā] - (pronoun) he or him', )
    
    

  • 替换:

    var_export( preg_replace('/ (?=[\p{Katakana}\p{Hiragana}\p{Han}] \[)/u', '<br />', $text) );
    HTML 渲染输出:

    '我 [wǒ] - (pronoun) I or me 你 [nǐ] - (pronoun) you (second person singular); yourself 他 [tā] - (pronoun) he or him'
    
    
© www.soinside.com 2019 - 2024. All rights reserved.