【问题标题】:preg_replace all cyrillic characters between bracketspreg_replace 括号之间的所有西里尔字符
【发布时间】:2014-01-15 23:32:55
【问题描述】:

我需要将所有西里尔字符替换为“[]”括号之间的拉丁等价字符。示例如下:

Приметимо да
формула (\ref{ј5121}) обухвата
и случајеве а) и б).
Заиста, из (\ref{ј5121}), за $x_1=x_2$
добија се:
\[
|АБ|=\sqrt{(y_2-у_1)^2}=|y_2-п_1|,
\]
а из (\ref{ј5121}), за $y_1=y_2$:
\[
|AЦ|=\sqrt{(м_2-х_1)^2}=|н_2-x_1|.
\]

Стога се формула (\ref{ј5121}) може
применити на било које
двe тачке, без обзира
на њихов положај.

我已经设法用这段代码隔离了括号之间的内容: $pattern = "/[([^)]*)]/"; preg_match_all($pattern, $string, $output);

但我不能让它用拉丁字符替换西里尔字符:\ 欢迎任何形式的帮助。谢谢!

【问题讨论】:

  • 问题是西里尔字母在拉丁字母中并不总是有一个等效的字母(例如:Ц => TS)。如果您将|AЦ| 替换为|ATS|,您的数学表达式就没有意义了。

标签: php preg-replace cyrillic


【解决方案1】:

你可以用这个:

$data = <<<'LOD'
Приметимо да
формула (\ref{ј5121}) обухвата
и случајеве а) и б).
Заиста, из (\ref{ј5121}), за $x_1=x_2$
добија се:
\[
|АБ|=\sqrt{(y_2-у_1)^2}=|y_2-п_1|,
\]
а из (\ref{ј5121}), за $y_1=y_2$:
\[
|AЦ|=\sqrt{(м_2-х_1)^2}=|н_2-x_1|.
\]
LOD;

$pattern = '~(?<=\[)[^]]++(?=])~u';

$result = preg_replace_callback($pattern, function ($m) {
    $cyrillic2latin = array(
        'A'=>'A', 'Б'=>'B', 'В'=>'V', 'Г'=>'G', 'Д'=>'D', 'Е'=>'E',
        'Ё'=>'YO', 'Ж'=>'ZH', 'З'=>'Z', 'И'=>'I', 'Й'=>'J', 'К'=>'K',
        'Л'=>'L', 'М'=>'M', 'Н'=>'N', 'О'=>'O', 'П'=>'P', 'Р'=>'R',
        'С'=>'S', 'Т'=>'T', 'У'=>'U', 'Ф'=>'F', 'Х'=>'H', 'Ц'=>'TS',
        'Ч'=>'CH', 'Ш'=>'SH', 'Щ'=>'SHCH', 'Ъ'=>'\'', 'Э'=>'E', 'Ю'=>'YU',
        'Я'=>'YA');
    return strtr($m[0], $cyrillic2latin);
}, $data);
print_r($result);

请随意更正并添加小写字母!

如果您使用 PHP >= 5.4.0,您可以将函数更改为:

$result = preg_replace_callback($pattern, function ($m) {
    return transliterator_transliterate("Cyrillic-Latin", $m[0]);
}, $data);

【讨论】:

  • 是的,这很有帮助 :) 谢谢!
猜你喜欢
  • 2011-12-06
  • 1970-01-01
  • 2021-09-25
  • 2018-02-19
  • 1970-01-01
  • 2014-03-04
  • 2016-05-10
  • 1970-01-01
  • 2011-07-24
相关资源
最近更新 更多