我怎样才能分割这条线:
我 [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
$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;
如果您确定格式,您可以尝试类似的操作,但是如果没有正确的分隔符,一切都只是猜测,您可能会得到不正确的转换。
$str = preg_replace("/\s+(\S+\s+\[\S+\])/", "<br />$1", $str);
如果我的解释是正确的,你想在每个中文/日文字符之前中断吗?
在 php 手册中,ord 函数的注释中有许多关于 UTF-8 ord 函数的建议/代码。 使用这样的函数,您可以通过字符串逐个 UTF-8 代码点迭代 UTF-8 代码点,如果您遇到一个代码点(字符),其 ord 是 > 中文/日文字符的开头,请首先插入
或其他内容。
这是我对之前发布的一篇文章的看法 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;
}
?>
<?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>";
}
?>
<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'