2014-12-12 4 views
0

У меня есть это выражение, чтобы определить URL, и превратить их в ссылки:preg_replace для URL, добавляющих с запятой после специальных символов

$string = preg_replace("/(\A|[^=\]'\"a-zA-Z0-9])((http|ftp|https|ftps|irc):\/\/[^<>\s()]+)/i", "\\1<a href=\"\\2\">\\2</a>", $string); 

Он отлично работает, кроме случаев, когда есть знаки препинания в конце URL-адреса (например, когда URL-адрес находится в конце предложения). Он обрабатывает знаки препинания, как часть URL-адреса, что, очевидно, означает, что ссылка не будет работать.

Чтобы исправить это, я добавил границу слова (\ b) в конце выражения. Он отлично работает - периоды, запятые и т. Д. Больше не добавляются в ссылку! За исключением трех символов &' и " Те не только получить в сочетании с URL, но заменить строку добавляет точку с запятой. Например:..

  • [ааа] .com
  • [БББ] .com,
  • [ссс] .com?

  • [ххх] .com &

  • [ууу] .com»
  • [ZZZ] .com»

стать

  • [ааа] .com.
  • [В] .com,
  • [ссс] .com?

  • [xxx] .com &;

  • [yyy] .com ';
  • [ZZZ] .com»;.

(. Выделенная часть представляет собой то, что теперь linkified - точка с запятой вставляется как обычный текст) Периоды, запятые и другие puctuation успешно игнорировали Амперсанды и цитаты метки включены как часть ссылки, а точка с запятой в виде простого текста вставлена ​​в конце, даже если она не соответствует совпадающему тексту.

Я искал и искал, почему, и я не могу найти все, что объясняет это. Я протестировал выражение на сайтах тегов preg_replace, и он не вызывают любые про там, на самом деле, он работает точно так, как должен, только для соответствия URL, а не символа конца. Вероятно, это что-то простое, что я не знаю о regex или preg_replace, но я не знаю, как успешно игнорировать все знаки пунктуации/специальные символы в конце URL-адреса и не иметь какой-то странной вставки точки с запятой после &, , или ".

+1

работает для меня: http://codepad.viper-7.com/69euuK без дополнительной точки с запятой, пари, это еще где в коде –

+0

Can вы предоставляете образец того, что вы пытаетесь проанализировать? –

ответ

1

Просто поместите отрицательный 'назад в конце:

/my_url_regex(?<![.!?,'\"])/ 
+0

Спасибо - это был очевидный бит, о котором я должен был подумать! – Dion

Смежные вопросы