у меня есть следующая проблема
у меня есть регулярное выражение, которое я не сделал сам:
"|(?!<.*?)\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 );
Насколько я понимаю вопрос, вы хотите заменить такой, как ОртоЦентр
но также 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);
Использование этого шаблона (или аналогичного) должно быть в состоянии сделать то, что вы хотите:
/(?!<.*?)([\\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