- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Привет. На сайте давно используется автоматическая перелинковка страниц с помощью функции, ищущей нужные слова благодаря preg_replace. На днях столкнулся с проблемой, которая заключается в том, что функция заменяет на ссылки не только нужные слова, но и куски более длинных.
$text = preg_replace('~' . $value['faq_menu'] . '([\s\.\,])~is', '<a href="/faq/' . $value['faq_url'] . '/">' . $value['faq_menu'] . '</a>\1', $text);Самым логичным вариантом показалось добавление модификатора \b, получился вот такой код:
$text = preg_replace('~\b' . $value['faq_menu'] . '\b([\s\.\,])~is', '<a href="/faq/' . $value['faq_url'] . '/">' . $value['faq_menu'] . '</a>\1', $text);Который отказался работать. Погуглив, я узнал, что с кириллицей этот модификатор в принципе не работает, хотя у некоторых людей почему-то таких проблем нет. Ничего дельного я не нашёл, поэтому решил спросить совет здесь. Используется UTF-8 если это важно.
Как-то странно код вставился, позаменял символы. Вот было и стало:
$text = preg_replace('~' . $value['faq_menu'] . '([\s\.\,])~is', '<a href="/faq/' . $value['faq_url'] . '/">' . $value['faq_menu'] . '</a>\1', $text);
$text = preg_replace('~\b' . $value['faq_menu'] . '\b([\s\.\,])~is', '<a href="/faq/' . $value['faq_url'] . '/">' . $value['faq_menu'] . '</a>\1', $text);
Используется UTF-8 если это важно.
Для многобайтовых нужен U
~is меняем на ~Uis
А если и
$text = preg_replace('~\b' . $value['faq_menu'] . '\b([\s\.\,])~Uis', '<a href="/faq/' . $asg['faq_url'] . '/">' . $value['faq_menu'] . '</a>\1', $text, 1);не работает, в какую сторону копать?
А если и
$text = preg_replace('~\b' . $value['faq_menu'] . '\b([\s\.\,])~Uis', '<a href="/faq/' . $asg['faq_url'] . '/">' . $value['faq_menu'] . '</a>\1', $text, 1);не работает, в какую сторону копать?
([\s\.\,]) - не указана длина символов
([\s\.\,]{1,}) - как-то так
и \b я наверно убрал бы, тут нужно прогуляться с вариантами с этим \b
И для вставки кода используйте цитату, а не "код" в редакторе форма.
Погуглил ещё, попробовал сделать
Стало находить нормально, но кушает пробелы при замене. В принципе, можно было бы просто добавить пробелы в замене, но тогда всё сломается, если будет конец предложения.
Такой вариант тоже работает, но также любит пробелы съедать.
Но это уже фигня какая-то, у некоторых модификатор \b спокойно работает.
Для многобайтовых нужен U
~is меняем на ~Uis
Только вот модификатор U (PCRE_UNGREEDY) вовсе не для этого. Он просто инвертирует жадность квантификаторов.
Тут нужен u (PCRE_UTF8). http://php.net/manual/ru/reference.pcre.pattern.modifiers.php
~is меняем на ~uis
Стало находить нормально, но кушает пробелы при замене.
какие пробелы?
---------- Добавлено 14.01.2016 в 23:31 ----------
А вообще, готовое решение по вашему вопросу такое:
Только вот модификатор U (PCRE_UNGREEDY) вовсе не для этого. Он просто инвертирует жадность квантификаторов.
Тут нужен u (PCRE_UTF8). http://php.net/manual/ru/reference.pcre.pattern.modifiers.php
~is меняем на ~uis
В том-то и дело, что u не сработал, его я пытался использовать ещё до создания темы здесь.
какие пробелы?
лаллала нужное_слово лалала меняет на лаллаланужное_словолалала
А вообще, готовое решение по вашему вопросу такое:
Не работает любой preg_replace, если использовать /b. Ни на локалке, ни на сервере.
Возможно, что-то не так с содержимым переменной, хотя вроде всё окей, кодировка точно UTF-8.
Возможно, что-то не так с содержимым переменной, хотя вроде всё окей, кодировка точно UTF-8.
Вот .проверил, символы в переменной, перед загрузкой нужно экранировать, b не нужен вроде
$replace = 'dhjrij//';
$replace = str_ireplace(['/', '#', '$', '^', '.'], ['\/', '\#', '\$', '\^', '\.'], $replace);
$url = 'anyurl.html';
$text = preg_replace("/".$replace."/ui", '<a href="/faq/'.$url.'">'.$replace.'</a>', $text);
echo $text;
Вырезает из слов по-прежнему.
header("Content-Type: text/html; charset=utf-8");
$text = 'лалаланужное_словолалала нужное_слово лалала';
$replace = 'нужное_слово';
$replace = str_ireplace('[\'/\', \'#\', \'$\', \'^\', \'.\']', '[\'\/\', \'\#\', \'\$\', \'\^\', \'\.\']', $replace);
$url = 'anyurl.html';
$text = preg_replace('/'.$replace.'/ui', '<a href="'.$url.'">'.$replace.'</a>', $text);
echo $text;
На выходе оба становятся ссылками. Думаю, без \b тут не разобраться. Пока что чуть изменил тексты, в которых происходила ненужная замена, но это такой себе костыль.
Ну раз \b не работает с кириллицей в UTF-8, то можно попробовать через cвойства unicode-символов.
Шаблон проверяет, что вокруг слова нет других букв.