X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> Замена слова на ссылку - помогите с preg_replace
toorr2p
toorr2p
Topic Starter сообщение 4.4.2014, 15:20; Ответить: toorr2p
Сообщение #1


Всем привет! 
Помогите пожалуйста с регуляркой, есть список терминов (слов), а также есть текст статьи (не просто строка, ас разметкой). Нужно чтобы все совпадения слов с терминами, заменялись на ссылку.

На скрине синим отмечена правильная замена слов на ссылки, а красным не правильная:
 860c6c7837ff.jpg

Не могу понять как правильно составить pattern для замены, чтобы заменялись только слова с точным совпадением. Например если термин Атлас, то заменялись только слова Атлас или в ковычках "Атлас", но не часть слова в Атласные.

Используется вот такой код, помогите его доработать:

$patterns = array ("#([\W])".$jsArr->title."([^\-*])#Ui");
$replace = array ('$1<a href="'.$jsArr->href.'">'.$jsArr->title.'</a>$2');
$out->mBodytext = preg_replace($patterns, $replace, $out->mBodytext);



Сообщение отредактировал Вячеслав - 4.4.2014, 15:20
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
сообщение 4.4.2014, 16:45; Ответить: matroskin8
Сообщение #2


Приветствую.
Примерно такой шаблон составил:

#"?(?<![а-я])атлас(?![а-я])"?#iu

Если нет ошибок вида 1атлас и т.п., тогда подходит, как есть. Если есть подобные ошибка, когда в слово атлас могут входить в начале и в конце любые символы, кроме кириллических, тогда в диапазон кириллических символов в начале и конце слова нужно включить эти возможные символы.
Ну и при проверке такой код:

$str = '
аатлас
атлас
атласный
"атлас"
Атлас
"Атлас"
';
$pattern = '#"?(?<![а-я])атлас(?![а-я])"?#iu';
preg_match_all($pattern, $str, $matches);
echo "<pre>" .print_r($matches, true). "</pre>";

выдал, вроде как, нужный результат:

Array
(
[0] => Array
(
[0] => атлас
[1] => "атлас"
[2] => Атлас
[3] => "Атлас"
)

)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
toorr2p
toorr2p
Topic Starter сообщение 4.4.2014, 16:53; Ответить: toorr2p
Сообщение #3


Большое спасибо за ответ!
остались проблемы со словами через тире
2b3a577c7be4.jpg
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
сообщение 4.4.2014, 17:03; Ответить: matroskin8
Сообщение #4


(Вячеслав) *
Большое спасибо за ответ!

Пожалуйста.

(Вячеслав) *
остались проблемы со словами через тире

Ну так я ведь писал:
(matroskin8) *
когда в слово атлас могут входить в начале и в конце любые символы, кроме кириллических, тогда в диапазон кириллических символов в начале и конце слова нужно включить эти возможные символы

Включите эти тире в шаблон и все будет ок ;)

$str = '
аатлас
атлас
атласный
"атлас"
Атлас
"Атлас"
Атлас-стрейч
Хан-Атлас
';
$pattern = '#"?(?<![а-я-])атлас(?![а-я-])"?#iu';
preg_match_all($pattern, $str, $matches);
echo "<pre>" .print_r($matches, true). "</pre>";

Результат:

Array
(
[0] => Array
(
[0] => атлас
[1] => "атлас"
[2] => Атлас
[3] => "Атлас"
)

)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
toorr2p
toorr2p
Topic Starter сообщение 4.4.2014, 17:09; Ответить: toorr2p
Сообщение #5


ага! я вот так сделал:

$patterns = array ('#"?(?<![а-я\-])'.$jsArr->title.'(?![а-я\-])"?#iu');

 правильно что обратный слешь перед тире?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
сообщение 4.4.2014, 17:12; Ответить: matroskin8
Сообщение #6


Он там не нужен, поскольку тире в конце или начале диапазонов является литералом (обычным символом), а не интервальным символом, поэтому его нет смысла экранировать.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
toorr2p
toorr2p
Topic Starter сообщение 4.4.2014, 17:23; Ответить: toorr2p
Сообщение #7


а как быть вот с этими? 
2b548f7699e1.jpg
если добавить так, то не срабатывает:

$patterns = array ('#"?(?<![а-я-\«])'.$jsArr->title.'(?![а-я-\»])"?#');
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
сообщение 4.4.2014, 17:42; Ответить: matroskin8
Сообщение #8


(Вячеслав) *
если добавить так, то не срабатывает:

А почему так должно сработать?
Во-первых, угловые скобки перепутаны местами... сейчас вы перед словом атлас поставили открывающую угловую скобку, но ведь должна быть закрывающая, т.е. не «Ментенон« Атлас, а таки «Ментенон» Атлас... то же самое касается скобки после искомого слова: не Атлас »Ментенон», а Атлас «Ментенон»
Во-вторых, между угловыми скобками и словом Атлас есть еще и пробел.
Ну и зачем там еще и обратный слеш - не понял.

$str = '
аатлас
атлас
атласный
"атлас"
Атлас
"Атлас"
Атлас-стрейч
Хан-Атлас
Атлас «Ментенон»
Атлас Ментенон
';
$pattern = '#"?(?<![а-я-]|» )атлас(?![а-я-]| «)"?#iu';
preg_match_all($pattern, $str, $matches);
echo "<pre>" .print_r($matches, true). "</pre>";


Array
(
[0] => Array
(
[0] => атлас
[1] => "атлас"
[2] => Атлас
[3] => "Атлас"
[4] => Атлас
)

)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
toorr2p
toorr2p
Topic Starter сообщение 4.4.2014, 17:58; Ответить: toorr2p
Сообщение #9


вот так тоже не работает (((

'#"?(?<![а-я-]| «)'.$jsArr->title.'(?![а-я-]|» )"?#'
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
сообщение 4.4.2014, 18:11; Ответить: matroskin8
Сообщение #10


Я для кого регулярное выражение выше написал и долго расписывал расположение угловых скобок?
Сравните ваш шаблон с моим и найдите разницу... ну или просто возьмите мой шаблон)))
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Помогите вспомнить рекламного бота Телеграм для обмена рекламой
0 Mixatraider 692 21.2.2024, 23:42
автор: Mixatraider
Открытая тема (нет новых ответов) Как првильно указать слова для рекламы в Google на двух языках
1 Nekit 907 12.2.2024, 23:58
автор: malamut
Горячая тема (нет новых ответов) Microsoft отказался работать в России: на что повлияет и есть ли ему замена
30 Room 4482 30.12.2023, 23:17
автор: australianman
Открытая тема (нет новых ответов) Размещу ссылку, статью, обзор на своих сайтах
Качественно и не дорого
3 Funoman 2415 12.10.2023, 13:27
автор: CryptoTims
Открытая тема (нет новых ответов) Получил странную ссылку при линкбилдинге
Как поведет себя поиск при обнаружении странной ссылке?
10 r0mZet 2179 24.10.2022, 19:23
автор: Wachowski


 



RSS Текстовая версия Сейчас: 29.3.2024, 16:47
Дизайн