我遇到了以下问题
我有一个正常的表达,我没有自己做:
"|(?!<.*?)\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 );
答案 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}}