yodaexolon Posted January 6, 2016 Report Share Posted January 6, 2016 Что прописать, чтобы не учитывался символ # в ссылке на якорь и в тегах цвета (например #000000) return preg_replace('/#(\w+)/u', '<a href="tags?keyword=$1">#$1</a>', $str); Quote Link to post Share on other sites
Kors Posted January 6, 2016 Report Share Posted January 6, 2016 "чтобы не учитывался символ # в ссылке на якорь", надо соответственно программировать браузеры... Вы б написали толком, что хотите. Можно гадать по-разному:1. преобразовать строку, удалив из ссылок #text_after,2. преобразовать строку, удалив из атрибутов цвета #color,3. вхождения в строку типа #text преобразовать в ссылку,4. другое? Пример желаемого преобразования хорошо бы дать... Quote Link to post Share on other sites
yodaexolon Posted January 6, 2016 Author Report Share Posted January 6, 2016 вхождения в строку типа #text преобразовать в ссылку Quote Link to post Share on other sites
Kors Posted January 6, 2016 Report Share Posted January 6, 2016 вхождения в строку типа #text преобразовать в ссылку Ваш код из первого поста это как раз и делает... Quote Link to post Share on other sites
yodaexolon Posted January 6, 2016 Author Report Share Posted January 6, 2016 мне нужно, чтобы преобразовывался текст с символом # в ссылку и игнорировались коды цвета типа #000000 и ссылки содержащие # в тексте делаю хэш теги и эта регулярка преобразует и то, что нужно слова с # и также то что не нужно код цвета и ссылки с якорем # Quote Link to post Share on other sites
Kors Posted January 6, 2016 Report Share Posted January 6, 2016 мне нужно, чтобы преобразовывался текст с символом # в ссылку и игнорировались коды цвета типа #000000 и ссылки содержащие # в тексте делаю хэш теги и эта регулярка преобразует и то, что нужно слова с # и также то что не нужно код цвета и ссылки с якорем # Пример желаемого преобразования хорошо бы дать... Quote Link to post Share on other sites
yodaexolon Posted January 6, 2016 Author Report Share Posted January 6, 2016 обычный текст: текст .................... #хэштег .......... - это все нормально заменяет на нужную ссылку <a href="tags?keyword=хэштег</a> если в тексте ссылка с якорем: текст................ <a href=sitename/blog/статья#якорь</a> .........текст - заменяет на корявую ссылку: <a href=sitename/blog/статья<a href="tags?keyword=хэштег</a></a>так же если в тексте стиль с цветом #код цвета Quote Link to post Share on other sites
mishanya Posted January 6, 2016 Report Share Posted January 6, 2016 (edited) мне нужно, чтобы преобразовывался текст с символом # в ссылку и игнорировались коды цвета типа #000000 и ссылки содержащие # в тексте делаю хэш теги и эта регулярка преобразует и то, что нужно слова с # и также то что не нужно код цвета и ссылки с якорем # реально а вы не подумали ставить другой тег?) который бы не давал конфликт с цветами и анкорами? например не одну решетку а две ##хэштег. какая разница какой он, если всеровно дальше идет замена на ссылку Edited January 6, 2016 by mishanya Quote Link to post Share on other sites
yodaexolon Posted January 6, 2016 Author Report Share Posted January 6, 2016 не красиво будет в тексте тег с ## Quote Link to post Share on other sites
mishanya Posted January 6, 2016 Report Share Posted January 6, 2016 (edited) не красиво будет в тексте тег с ## я вас удивлю, но $str = 'если бы я правильно ##понимал регулярки <a href="#name">и еще что-то</a>'; echo preg_replace('/##(\w+)/u', '<a href="tags?keyword=$1">#$1</a>', $str); возвращает если бы я правильно <a href="tags?keyword=понимал">#понимал</a> регулярки <a href="#name">и еще что-то</a> Edited January 6, 2016 by mishanya Quote Link to post Share on other sites
yodaexolon Posted January 6, 2016 Author Report Share Posted January 6, 2016 спасибо, так работает, а можно сделать, чтоб один раз решетку прописывать? Quote Link to post Share on other sites
mishanya Posted January 6, 2016 Report Share Posted January 6, 2016 (edited) спасибо, так работает, а можно сделать, чтоб один раз решетку прописывать? зачем вы усложняете себе жизнь? можно еще учитывать что перед хештегом должен быть пробел, тогда должно работать с одним # и код $str = 'если бы я правильно #понимал регулярки <a href="#name">и еще что-то</a> <span style="color:#FF0000;">цветной текст</span>'; echo preg_replace('/\s#(\w+)/u', ' <a href="tags?keyword=$1">#$1</a>', $str); вернет если бы я правильно #понимал регулярки и еще что-то цветной текст Edited January 6, 2016 by mishanya Quote Link to post Share on other sites
yodaexolon Posted January 6, 2016 Author Report Share Posted January 6, 2016 Теперь два пробела надо ставить, может есть значение которое игнорировало б второй #? Quote Link to post Share on other sites
mishanya Posted January 6, 2016 Report Share Posted January 6, 2016 (edited) Теперь два пробела надо ставить, может есть значение которое игнорировало б второй #? мда, вы читаете что пишу? внимательно посмотрите, не надо там два пробела.в вашем случае строка будет return preg_replace('/\s#(\w+)/u', ' <a href="tags?keyword=$1">#$1</a>', $str); что я выше описал, только уже с return Edited January 6, 2016 by mishanya Quote Link to post Share on other sites
yodaexolon Posted January 6, 2016 Author Report Share Posted January 6, 2016 Урааа заработало, СПАСИБО ВАМ!!!!!!!!!!!! Quote Link to post Share on other sites
yodaexolon Posted January 11, 2016 Author Report Share Posted January 11, 2016 зачем вы усложняете себе жизнь? можно еще учитывать что перед хештегом должен быть пробел, тогда должно работать с одним # и код $str = 'если бы я правильно #понимал регулярки <a href="#name">и еще что-то</a> <span style="color:#FF0000;">цветной текст</span>'; echo preg_replace('/\s#(\w+)/u', ' <a href="tags?keyword=$1">#$1</a>', $str); вернетОпять косяки, когда цвет с пробелом: color: #FF0000; Quote Link to post Share on other sites
chocolate_moles Posted January 11, 2016 Report Share Posted January 11, 2016 Опять косяки, когда цвет с пробелом: color: #FF0000; Замените в документе color: # на color:# Quote Link to post Share on other sites
yodaexolon Posted January 11, 2016 Author Report Share Posted January 11, 2016 редактор не дает это сделать, задолбался уже, буду по совету mishanya ставить две решетки Quote Link to post Share on other sites
mishanya Posted January 11, 2016 Report Share Posted January 11, 2016 редактор не дает это сделать, задолбался уже, буду по совету mishanya ставить две решетки я вам советовал не усложнять свою жизнь). всеровно ## будет выводить один # если хотите заменить пробел у цвета, пробуйте перед регуляркой так сделать: $str = str_replace('color: #','color:#', $str); return preg_replace('/\s#(\w+)/u', ' <a href="tags?keyword=$1">#$1</a>', $str); Quote Link to post Share on other sites
yodaexolon Posted January 11, 2016 Author Report Share Posted January 11, 2016 Спасибо, теперь работает как надо. Quote Link to post Share on other sites
Kors Posted January 12, 2016 Report Share Posted January 12, 2016 А еще в 'color: #' может быть ДВА пробела...А еще в стилях может быть, например, ' border: 1px #888 solid'... Quote Link to post Share on other sites
yodaexolon Posted January 12, 2016 Author Report Share Posted January 12, 2016 А еще в 'color: #' может быть ДВА пробела...А еще в стилях может быть, например, ' border: 1px #888 solid'...А как все это обойти? Quote Link to post Share on other sites
mishanya Posted January 12, 2016 Report Share Posted January 12, 2016 (edited) А как все это обойти? редактор не поставит там два пробела где цвет и я очень сомневаюсь что border: 1px #888 solid вы будете использовать в описнии. для каждого случая не будете городить условия. заменяйте # на ## и все. всеровно видить их два будете только вы в админке. какая разница? Edited January 12, 2016 by mishanya Quote Link to post Share on other sites
yr4ik Posted January 12, 2016 Report Share Posted January 12, 2016 (edited) Ну что бы не учитывать стили - без усложнения никак. Вот набросал код. Сильно не проверял но должно работать: $new_str = $str; if(preg_match_all('#(style|href)=([\'"])([^\'"]+?)\\2#iu', $str, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) {//Затираем style foreach($matches as $m){ $_length = strlen($m[0][0]); $new_str = substr_replace($new_str, str_repeat('*', $_length), $m[0][1], $_length); } } if(preg_match_all('/#(\w+)/iu', $new_str, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) {//Поиск наших тегов $_offset = 0; foreach($matches as $m){ $_length = strlen($m[0][0]); $replace = '<a href="tags?keyword='.$m[1][0].'">#'.$m[1][0].'</a>'; $str = substr_replace($str, $replace, $m[0][1] - $_offset, $_length); $_offset += $_length - strlen($replace); } } return $str; За первый проход - затираем атрибуты которые могут совпадать с нашим патерном - звездочками (*).За второй, исходя из того что осталось, меняем наши метки. Edited January 13, 2016 by yr4ik Quote Link to post Share on other sites
yodaexolon Posted January 12, 2016 Author Report Share Posted January 12, 2016 yr4ik, Ваш код не хочет работать, та же проблема что в самом начале.Спасибо всем за помощь, код mishanya прекрасно справляется с задачей. Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.