Нужна помощь с регулярным выражением и кириллицей

у меня есть следующая проблема

у меня есть регулярное выражение, которое я не сделал сам:

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

он чудесным образом находит $ old_text в $ text

но если $ old_text например

"ОртоЦентр"

это не найдет это

я уверен, что это все о /b границы, ссылающиеся на

Регулярное выражение с кириллицей

поэтому я попытался адаптировать его как

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

или же

\wа-я$old_text\wа-я

также попробовал что-н. как с использованием диапазона Юникод:

|(?!<.*?)\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

Решение

Насколько я понимаю вопрос, вы хотите заменить такой, как ОртоЦентр но также aaaОртоЦентрzzz с <a href="http://foo.bar">...</a> где ... это подходящее слово.

Из вашего начального выражения, похоже, что это должно быть сделано только «внешние теги».

Для работы с юникодом необходимо указать u (PCRE_UTF8) модификатор. Ожидается, что и шаблон, и входные данные будут действительны в UTF-8. Мой следующий пример также использует i модификатор без учета регистра.

Было бы пропускать теги: <[^>]*>(*SKIP)(*F) или же | сопоставить слово с * любое количество \p{L} Юникод буквы до и после: \b\p{L}*word\p{L}*\b а также захватить. Образец-образец может быть:

~<[^>]*>(*SKIP)(*F)|\b(\p{L}*ОртоЦентр\p{L}*)\b~ui

Тест на regex101.com (см. объяснение на правой стороне)


И пример 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);

Тест на eval.in

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

По вопросам рекламы [email protected]