Jump to content

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


Go to solution Solved by yr4ik,

Recommended Posts

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

 

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

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

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

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

4. другое?

 

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

Link to post
Share on other sites

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

 

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

Link to post
Share on other sites

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

 

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

 

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

Link to post
Share on other sites

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

 

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

 

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

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

Link to post
Share on other sites

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

 

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

 

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

 

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

Edited by mishanya
Link to post
Share on other sites

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

 

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

$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 by mishanya
Link to post
Share on other sites

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

 

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

 

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

$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 by mishanya
Link to post
Share on other sites

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

 

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

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

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

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

Edited by mishanya
Link to post
Share on other sites

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

 

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

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

Link to post
Share on other sites

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

 

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

 

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

 

$str = str_replace('color: #','color:#', $str);
return preg_replace('/\s#(\w+)/u', ' <a href="tags?keyword=$1">#$1</a>', $str);
Link to post
Share on other sites

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

 

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

 

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

Edited by mishanya
Link to post
Share on other sites

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

 

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

 



$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 by yr4ik
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...