需要有关regexp和西里尔语的帮助

时间:2014-10-10 20:52:31

标签: php regex unicode

我遇到了以下问题

我有一个正常的表达,我没有自己做:

"|(?!<.*?)\b$old_text\b(?![^<>]*?>)|s"

它奇妙地在$ text

中找到$ old_text

但是,例如$ old_text是

"ОртоЦентр"

它找不到它

我确信这一切都与/b边界有关,而且是

Regular expression with the cyrillic alphabet

所以我试着像

那样适应它
\[wа-я]+$old_text\[wа-я]+

\wа-я$old_text\wа-я
还试过了......比如使用unicode范围:

|(?!<.*?)\x{0410}$old_text\x{042F}(?![^<>]*?>)|

也试过这个西里尔字母,但我不能正确使用:

"|(?!<.*?)\b{Cyrillic}$old_text\b{Cyrillic}(?![^<>]*?>)|si"

也许这是正确的方向? 但嘿,所有人都不工作,有些天才可以。协助我 ? 提前谢谢

更新

"|(?!<.*?)\p{Cyrillic}+\b$old_text\b(?![^<>]*?>)|si"

更新,继承人的PHP代码:

$text = "bar foo <p> barfoo </p> foobar ОртоЦентр bar bar";
$old_text = "ОртоЦентр";
$new_text = '<a href="http://foo.bar">ОртоЦентр</a>';
$limit = '-1';

$replaced = preg_replace( "|(?!<.*?)(\p{Cyrillic}+$old_text\b)(?![^<>]*?>)|si", $new_text, $text, $limit );

2 个答案:

答案 0 :(得分:1)

使用此模式(或类似模式)应该能够做到你想要的:

/(?!<.*?)([\\p{Cyrillic}]+)(?![^<>]*?\\>)/umi

代码:

<?php

$regex = "/(?!<.*?)([\\p{Cyrillic}]+)(?![^<>]*?\\>)/umi";
$strng = "bar foo <p> barfoo </p> foobar ОртоЦентр bar bar\n";
$subst = '<a href="http://foo.bar">$1</a>';
$limit = '-1';

$result = preg_replace($regex, $subst, $strng, $limit);

echo $result . "\n";

?>

<强>结果:

bar foo <p> barfoo </p> foobar <a href="http://foo.bar">ОртоЦентр</a> bar bar

示例(一个或多个):

注意:如果您的字符串不止一个字(i.e. Россия прохладно),则需要对模式稍作更改:

/(?!<.*?)([\p{Cyrillic}]+.+[\p{Cyrillic}]+)(?![^<>]*?\\>)/umi

答案 1 :(得分:1)

根据我的理解,您希望将ОртоЦентр替换为aaaОртоЦентрzzz,并将<a href="http://foo.bar">...</a>替换为...,其中u是匹配的字词。

从你的初始正则表达式看来,这应该只在“外部标签”完成。

要使用unicode,需要指定i(PCRE_UTF8)modifier。模式和输入都应该是有效的UTF-8。我的以下示例还使用了<[^>]*>(*SKIP)(*F)无括号修饰符。

标记:|* skip\p{L}之前和之后的任何数量的\b\p{L}*word\p{L}*\b unicode letters匹配~<[^>]*>(*SKIP)(*F)|\b(\p{L}*ОртоЦентр\p{L}*)\b~ui capture {1}}和Test at regex101.com。样本模式可以是:

$txt = "bar foo <p> barfoo </p> foobar aОртоЦентрz bar bar";

$w = "ОртоЦентр";

$s = '~<[^>]*>(*SKIP)(*F)|\b(\p{L}*'.preg_quote($w,'~').'\p{L}*)\b~ui';
$r = '<a href="http://foo.bar">\1</a>';

$replaced = preg_replace($s, $r, $txt);

Test at eval.in(见右侧解释)


带有变量的PHP样本:

{{1}}

{{3}}