Перейти к содержанию
Официальный форум поддержки Simpla

помогите с регуляркой


Перейти к решению Решено yr4ik,

Рекомендуемые сообщения

Что прописать, чтобы не учитывался символ # в ссылке на якорь и в тегах цвета (например #000000)

return preg_replace('/#(\w+)/u', '<a href="tags?keyword=$1">#$1</a>', $str);

 

Ссылка на сообщение
Поделиться на другие сайты

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

 

Вы б написали толком, что хотите. Можно гадать по-разному:

1. преобразовать строку, удалив из ссылок #text_after,

2. преобразовать строку, удалив из атрибутов цвета #color,

3. вхождения в строку типа #text преобразовать в ссылку,

4. другое?

 

Пример желаемого преобразования хорошо бы дать...

Ссылка на сообщение
Поделиться на другие сайты

мне нужно, чтобы преобразовывался текст с символом # в ссылку и игнорировались коды цвета типа #000000 и ссылки содержащие # в тексте

 

делаю хэш теги и эта регулярка преобразует и то, что нужно слова с # и также то что не нужно код цвета и ссылки с якорем #

Ссылка на сообщение
Поделиться на другие сайты

мне нужно, чтобы преобразовывался текст с символом # в ссылку и игнорировались коды цвета типа #000000 и ссылки содержащие # в тексте

 

делаю хэш теги и эта регулярка преобразует и то, что нужно слова с # и также то что не нужно код цвета и ссылки с якорем #

 

Пример желаемого преобразования хорошо бы дать...

Ссылка на сообщение
Поделиться на другие сайты

обычный текст: текст .................... #хэштег .......... - это все нормально заменяет на нужную ссылку <a href="tags?keyword=хэштег</a> 

 

если в тексте ссылка с якорем: текст................ <a href=sitename/blog/статья#якорь</a> .........текст -  заменяет на корявую ссылку:

 

<a href=sitename/blog/статья<a href="tags?keyword=хэштег</a></a>

так же если в тексте стиль с цветом #код цвета

Ссылка на сообщение
Поделиться на другие сайты

мне нужно, чтобы преобразовывался текст с символом # в ссылку и игнорировались коды цвета типа #000000 и ссылки содержащие # в тексте

 

делаю хэш теги и эта регулярка преобразует и то, что нужно слова с # и также то что не нужно код цвета и ссылки с якорем #

 

реально а вы не подумали ставить другой тег?) который бы не давал конфликт с цветами и анкорами?

 

например не одну решетку а две ##хэштег. какая разница какой он, если всеровно дальше идет замена на ссылку

Изменено пользователем mishanya
Ссылка на сообщение
Поделиться на другие сайты

не красиво будет в тексте тег с ##

 

я вас удивлю, но

$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>
Изменено пользователем mishanya
Ссылка на сообщение
Поделиться на другие сайты

спасибо, так работает, а можно сделать, чтоб один раз решетку прописывать?

 

зачем вы усложняете себе жизнь?

 

можно еще учитывать что перед хештегом должен быть пробел, тогда должно работать с одним # и код

$str = 'если бы я правильно #понимал регулярки <a href="#name">и еще что-то</a> <span style="color:#FF0000;">цветной текст</span>';
echo preg_replace('/\s#(\w+)/u', ' <a href="tags?keyword=$1">#$1</a>', $str);

вернет

 

если бы я правильно #понимал регулярки и еще что-то цветной текст
Изменено пользователем mishanya
Ссылка на сообщение
Поделиться на другие сайты

Теперь два пробела надо ставить, может есть значение которое игнорировало б второй #?

 

мда, вы читаете что пишу? внимательно посмотрите, не надо там два пробела.

в вашем случае строка будет

return preg_replace('/\s#(\w+)/u', ' <a href="tags?keyword=$1">#$1</a>', $str);

что я выше описал, только уже с return

Изменено пользователем mishanya
Ссылка на сообщение
Поделиться на другие сайты

зачем вы усложняете себе жизнь?

 

можно еще учитывать что перед хештегом должен быть пробел, тогда должно работать с одним # и код

$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;

Ссылка на сообщение
Поделиться на другие сайты

редактор не дает это сделать, задолбался уже, буду по совету mishanya ставить две решетки

Ссылка на сообщение
Поделиться на другие сайты

редактор не дает это сделать, задолбался уже, буду по совету mishanya ставить две решетки

 

я вам советовал не усложнять свою жизнь). всеровно ## будет выводить один #

 

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

 

$str = str_replace('color: #','color:#', $str);
return preg_replace('/\s#(\w+)/u', ' <a href="tags?keyword=$1">#$1</a>', $str);
Ссылка на сообщение
Поделиться на другие сайты

А еще в 'color:  #' может быть ДВА пробела...

А еще в стилях может быть, например, ' border: 1px  #888 solid'...

А как все это обойти?

Ссылка на сообщение
Поделиться на другие сайты

А как все это обойти?

 

редактор не поставит там два пробела где цвет и я очень сомневаюсь что border: 1px  #888 solid вы будете использовать в описнии. 

 

для каждого случая не будете городить условия. заменяйте # на ## и все. всеровно видить их два будете только вы в админке. какая разница?

Изменено пользователем mishanya
Ссылка на сообщение
Поделиться на другие сайты

Ну что бы не учитывать стили - без усложнения никак.

 

Вот набросал код. Сильно не проверял но должно работать: 

 



$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;

 

За первый проход - затираем атрибуты которые могут совпадать с нашим патерном - звездочками (*).

За второй, исходя из того что осталось, меняем наши метки. 

Изменено пользователем yr4ik
Ссылка на сообщение
Поделиться на другие сайты

yr4ik, Ваш код не хочет работать, та же проблема что в самом начале.

Спасибо всем за помощь, код mishanya прекрасно справляется с задачей.

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...