Php 需要regexp和西里尔文的帮助吗

Php 需要regexp和西里尔文的帮助吗,php,regex,unicode,Php,Regex,Unicode,我有以下问题 我有一个我自己没有做的正则表达式: "|(?!<.*?)\b$old_text\b(?![^<>]*?>)|s" 它找不到它 我确信这都是关于/b参考的边界 所以我试着去适应它 \[wа-я]+$old_text\[wа-я]+ 或 还尝试过使用unicode范围: |(?!<.*?)\x{0410}$old_text\x{042F}(?![^<>]*?>)| |(?!)| 我也尝试过这个西里尔语的东西,但我确信我没有使用正

我有以下问题

我有一个我自己没有做的正则表达式:

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

我确信这都是关于
/b
参考的边界

所以我试着去适应它

\[wа-я]+$old_text\[wа-я]+

还尝试过使用unicode范围:

|(?!<.*?)\x{0410}$old_text\x{042F}(?![^<>]*?>)|
|(?!)|
我也尝试过这个西里尔语的东西,但我确信我没有使用正确的:

"|(?!<.*?)\b{Cyrillic}$old_text\b{Cyrillic}(?![^<>]*?>)|si"
“|(?!)| si”
也许这是正确的方向? 但是,嘿,大家都不工作,能不能请一些天才。帮助我? 提前谢谢

更新:

"|(?!<.*?)\p{Cyrillic}+\b$old_text\b(?![^<>]*?>)|si"
“|(?!)| 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 );
$text=“bar foobarfoo

foobaröСццццbar”; $old_text=“ццццц”; $new_text=''; $limit='-1'; $replaced=preg_replace(“|(?!)| si“,$new_text,$text,$limit);
使用此模式(或类似模式)应该能够执行您想要的操作:

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

据我所知,您希望将诸如

从您的初始正则表达式来看,这似乎应该只在“外部标记”中完成

要使用unicode,需要指定
u
(PCRE\u UTF8)。那么,模式和输入都应该是有效的UTF-8。下面的示例还使用了
i
caseless修饰符

标签:
]*>(*SKIP)(*F)
是否将单词与
*
前后的
\p{L}
数量匹配:
\b\p{L}*word\p{L}*\b
和。示例模式可以是:

~<[^>]*>(*SKIP)(*F)|\b(\p{L}*ОртоЦентр\p{L}*)\b~ui
~]*>(*SKIP)(*F)|\b(\p{L}*oöиццццццц\p{L}*)\b~ui
(参见右侧的说明)


以及一个包含变量的PHP示例:

$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);
$txt=“bar foobarfoo

foobar aöСцццццz bar”; $w=“Сцццц”; $s='~]*>(*跳过)(*F)|\b(\p{L}*'.preg_quote($w,~')。\p{L}*)\b~ui'; $r=''; $replaced=preg_replace($s,$r,$txt);

您需要使用\p:
\p{Cyrillic}+
@l'l'l来初始化西里尔字母。您能解释一下如何以及在哪里吗?我在我的问题更新和其他一些观点中尝试了类似的方法,但没有明确的衡量标准,您的最终输出应该是什么样的?试试这个
“|(?!)| si”
,或者
“|(?!)| si”
@l'l'l它用一个链接替换一个单词,例如:将
改为
,也适用于非西里尔语words@l“L'L似乎不起作用:/这似乎逃过了$?不知道这个wheter使用:
“|(?!)替换西里尔语或非西里尔语|si“
,也许我忘了提到$old_text是一个php变量。如果您发布php代码,我可以看得更清楚。如果没有它,很难确切知道发生了什么。你想只捕获西里尔字母吗?用代码示例更新了这个问题,多亏了你的effordshm,我真的不知道你的意思,变量和preg_匹配与我的更新中完全一样,它适用于初始正则表达式和非西里尔字母word@johnSmith不客气!很高兴你能成功:)
<?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
/(?!<.*?)([\p{Cyrillic}]+.+[\p{Cyrillic}]+)(?![^<>]*?\\>)/umi
~<[^>]*>(*SKIP)(*F)|\b(\p{L}*ОртоЦентр\p{L}*)\b~ui
$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);