Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Хэш тег
Форумы портала PHP.SU » PHP » Регулярные выражения » Хэш тег

Страниц (1): [1]
 

1. tempo - 27 Марта, 2014 - 18:35:08 - перейти к сообщению
Есть регулярное выражение для отбора хэш тегов



все работает хорошо, но вот ловится и то что начинается не только на решетку(#)

Примером ловит



и такое



, а должно только такое

CODE (htmlphp):
скопировать код в буфер обмена
  1. #блабла
2. IllusionMH - 27 Марта, 2014 - 19:04:18 - перейти к сообщению
tempo, так добавьте начало ^ и конец строки $ в регулярку если ничего другого быть не должно
3. tempo - 27 Марта, 2014 - 19:17:33 - перейти к сообщению
IllusionMH пишет:
tempo, так добавьте начало ^ и конец строки $ в регулярку если ничего другого быть не должно


может быть но раздельно с хэштегом
4. IllusionMH - 27 Марта, 2014 - 20:45:19 - перейти к сообщению
tempo, тогда поставьте свое "раздельно" (\s или что там еще у вас может быть)
5. tempo - 27 Марта, 2014 - 20:52:13 - перейти к сообщению
IllusionMH пишет:
tempo, тогда поставьте свое "раздельно" (\s или что там еще у вас может быть)


в том то и вся суть что я не знаю как, потому и написал сюда

вот к примеру как должно быть

#tag - true
text #tag text - true
text #tag -true
text#tag - false


буду благодарен за помощь.
6. IllusionMH - 27 Марта, 2014 - 20:54:19 - перейти к сообщению
tempo, так ставьте пробел или начало строки, в чем трабл?
CODE (htmlphp):
скопировать код в буфер обмена
  1. /(?:^|\s)#(\S{1,24}+)(?:\s|$)/u
7. tempo - 27 Марта, 2014 - 20:55:48 - перейти к сообщению
IllusionMH пишет:
tempo, так ставьте пробел или начало строки, в чем трабл?
CODE (htmlphp):
скопировать код в буфер обмена
  1. /(?:^|\s)#(\S{1,24}+)(?:\s|$)/u


говорил же. что правильно не умею, можно сказать вообще не умею
(Добавление)
Делаю замену через preg_replace(), и пробелы пропадают. Думаю вы знаете почему, и знаю, возможно я не конкретно спросил, простите в таком случаи.
(Добавление)
Прошу прощение. Все правильно. большое вам спасибо!
8. DlTA - 27 Марта, 2014 - 23:13:52 - перейти к сообщению
/\b#(\w{1,24})\b/

\b - Граница слова wikipedia
9. tempo - 18 Апреля, 2014 - 14:21:42 - перейти к сообщению
IllusionMH пишет:
tempo, так ставьте пробел или начало строки, в чем трабл?
CODE (htmlphp):
скопировать код в буфер обмена
  1. /(?:^|\s)#(\S{1,24}+)(?:\s|$)/u


Не мог никак зайти на этот сайт.. есть один недостаток в вашем регулярном выражении, оно работает через один хэштег
(Добавление)
DlTA пишет:
/\b#(\w{1,24})\b/

\b - Граница слова wikipedia


Данное регулярное выражение вообще не находит совпадений
10. IllusionMH - 18 Апреля, 2014 - 14:28:34 - перейти к сообщению
tempo, результат для пиведенных строк совпадает с ожиданиями.
tempo пишет:
оно работает через один хэштег

Если вы пытаетесь работать с принципиально другими строками, чем выше, тогда она может и не сработать.
Подробней с примерами где сработало а где нет.
11. tempo - 18 Апреля, 2014 - 14:34:24 - перейти к сообщению
IllusionMH пишет:
tempo, результат для пиведенных строк совпадает с ожиданиями.
tempo пишет:
оно работает через один хэштег

Если вы пытаетесь работать с принципиально другими строками, чем выше, тогда она может и не сработать.
Подробней с примерами где сработало а где нет.


синий это ссылка(так должно быть при нахождении), черный просто текст(не найдено)

вот к примеру 4 хэштега подряд
12. IllusionMH - 18 Апреля, 2014 - 14:57:51 - перейти к сообщению
tempo, оно цепляло пробелы после слова.
/(?<=^|\s)#\S{1,24}+(?=$|\s)/u вот теперь не должно цеплять.
13. duhon - 22 Апреля, 2014 - 15:51:14 - перейти к сообщению
можно просто
PHP:
скопировать код в буфер обмена
  1. //Output for => 5.3.4
  2. $var = array(
  3.         '#tag',
  4.         'text #tag text',
  5.         'text #tag',
  6.         'text#tag',
  7. );
  8. $res = preg_replace('/\B#(\S{1,24}+)/u', '#<$1>' , $var);
  9. print_r($res);
  10. /*Array
  11. (
  12.     [0] => #<tag>
  13.     [1] => text #<tag> text
  14.     [2] => text #<tag>
  15.     [3] => text#tag
  16. )*/
  17. echo preg_replace('/\B#(\S{1,24}+)/u', '<$0>' , '#111 тапинамбур#222 #333 #444'); // <#111> тапинамбур#222 <#333> <#444>


P.S. как бонус срабатывает якорное ускорение работы регулярки
P.S.S если php старая то можно и так '/(?<!\S)#\S{1,24}+/u' (но лучше поменять php версию)
14. Sanek_OS9 - 06 Сентября, 2014 - 21:48:49 - перейти к сообщению
duhon пишет:
можно просто
PHP:
скопировать код в буфер обмена
  1. //Output for => 5.3.4
  2. $var = array(
  3.         '#tag',
  4.         'text #tag text',
  5.         'text #tag',
  6.         'text#tag',
  7. );
  8. $res = preg_replace('/\B#(\S{1,24}+)/u', '#<$1>' , $var);
  9. print_r($res);
  10. /*Array
  11. (
  12.     [0] => #<tag>
  13.     [1] => text #<tag> text
  14.     [2] => text #<tag>
  15.     [3] => text#tag
  16. )*/
  17. echo preg_replace('/\B#(\S{1,24}+)/u', '<$0>' , '#111 тапинамбур#222 #333 #444'); // <#111> тапинамбур#222 <#333> <#444>


P.S. как бонус срабатывает якорное ускорение работы регулярки
P.S.S если php старая то можно и так '/(?<!\S)#\S{1,24}+/u' (но лучше поменять php версию)


Спасибо все работает мне пригодилось)

 

Powered by ExBB FM 1.0 RC1