2012-03-29 2 views
1

Я реализовал «ссылку» на нашу систему OSticket и, похоже, работает чудесно, за исключением одного отмеченного недостатка, которого я не заметил в документации http://jmrware.com/articles/2010/linkifyurl/linkify.php. Когда за соединением следует a), ВКЛЮЧАЕТ это) в ссылку. GRRRфиксация скобок в регулярном выражении для связывания функции php?

Так мне было интересно, если есть какие-то супер регулярных выражений, ребята, что там может быть в состоянии отладки видя, как linkify не был обновлен через пару лет ...

Вот регулярное выражение, если необходимо:

$url_pattern = '/# Rev:20100913_0900 github.com\/jmrware\/LinkifyURL 
    # Match http & ftp URL that is not already linkified. 
     # Alternative 1: URL delimited by (parentheses). 
     (\()      # $1 "(" start delimiter. 
     ((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&\'()*+,;=:\/?#[\]@%]+) # $2: URL. 
     (\))      # $3: ")" end delimiter. 
    | # Alternative 2: URL delimited by [square brackets]. 
     (\[)      # $4: "[" start delimiter. 
     ((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&\'()*+,;=:\/?#[\]@%]+) # $5: URL. 
     (\])      # $6: "]" end delimiter. 
    | # Alternative 3: URL delimited by {curly braces}. 
     (\{)      # $7: "{" start delimiter. 
     ((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&\'()*+,;=:\/?#[\]@%]+) # $8: URL. 
     (\})      # $9: "}" end delimiter. 
    | # Alternative 4: URL delimited by <angle brackets>. 
     (<|&(?:lt|\#60|\#x3c);) # $10: "<" start delimiter (or HTML entity). 
     ((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&\'()*+,;=:\/?#[\]@%]+) # $11: URL. 
     (>|&(?:gt|\#62|\#x3e);) # $12: ">" end delimiter (or HTML entity). 
    | # Alternative 5: URL not delimited by(), [], {} or <>. 
     (      # $13: Prefix proving URL not already linked. 
     (?:^    # Can be a beginning of line or string, or 
     | [^=\s\'"\]]   # a non-"=", non-quote, non-"]", followed by 
     ) \s*[\'"]?   # optional whitespace and optional quote; 
     | [^=\s]\s+    # or... a non-equals sign followed by whitespace. 
    )      # End $13. Non-prelinkified-proof prefix. 
     (\b      # $14: Other non-delimited URL. 
     (?:ht|f)tps?:\/\/  # Required literal http, https, ftp or ftps prefix. 
     [a-z0-9\-._~!$\'()*+,;=:\/?#[\]@%]+ # All URI chars except "&" (normal*). 
     (?:     # Either on a "&" or at the end of URI. 
      (?!     # Allow a "&" char only if not start of an... 
      &(?:gt|\#0*62|\#x0*3e);     # HTML ">" entity, or 
      | &(?:amp|apos|quot|\#0*3[49]|\#x0*2[27]); # a [&\'"] entity if 
      [.!&\',:?;]?  # followed by optional punctuation then 
      (?:[^a-z0-9\-._~!$&\'()*+,;=:\/?#[\]@%]|$) # a non-URI char or EOS. 
     ) &     # If neg-assertion true, match "&" (special). 
      [a-z0-9\-._~!$\'()*+,;=:\/?#[\]@%]* # More non-& URI chars (normal*). 
     )*      # Unroll-the-loop (special normal*)*. 
     [a-z0-9\-_~$()*+=\/#[\]@%] # Last char can\'t be [.!&\',;:?] 
    )      # End $14. Other non-delimited URL. 
    /imx'; 

Я начал играть с ним, но это оказалось немного над моей головой. Я также хочу использовать другие альтернативные предложения, а не связывать их?

Если вы заметили вторую строчку: # Last char can\'t be [.!&\',;:?] В принципе, было бы неплохо добавить a) туда ...?

+0

Действительная ссылка URL может иметь круглые скобки на end (в пути, запросе или фрагменте). Если вы хотите исключить его (если он не является частью сбалансированной пары), вам нужно будет применить больше логики. – ridgerunner

ответ

0

Если вы просто хотите, чтобы соответствовать подстрокам, которые выглядят как HTTP/FTP URL-адрес, но не заканчиваются знаками препинания и т.д., вы можете использовать что-то простое, как:

\b(?:ht|f)tps?://[^\s<>"']+(?![][()<>{}.,!?:;"']) 

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

  • Нет связанных вопросов^_^