php使用preg_replace将网址转换为链接.....有时......:P

时间:2012-03-10 22:00:40

标签: php regex preg-replace

  

可能重复:
  How to add anchor tag to a URL from text input
  PHP Regular expression to match keyword outside HTML tag <a>

好吧,我正在使用OsTicket(电子邮件票证系统),并将其转换为使用HTML格式的电子邮件进出。它被黑了,但它确实有效。

那么,目前有一个名为“clickableURLS”的函数......

  function clickableurls($text) {

        //Not perfect but it works - please help improve it. 
        $text=preg_replace('/([^(\'|")]((f|ht){1}tp(s?):\/\/)[-a-zA-Z0-9@:%_\+.~#?&;\/\/=]+[^(\'|")])/','<a href="\\1" target="_blank">\\1</a>', $text);
        $text=preg_replace("/(^|[ \\n\\r\\t])([^('|\")]www\.([a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+)(\/[^\/ \\n\\r]*)*[^('|\")])/",
                '\\1<a href="http://\\2" target="_blank">\\2</a>', $text);
        $text=preg_replace("/(^|[ \\n\\r\\t])([^('|\")][_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,4}[^('|\")])/",'\\1<a href="mailto:\\2" target="_blank">\\2</a>', $text);


        return $text;
    }

正如您所看到的,它基本上需要一个URL(搜索http或https或www),然后在那里添加适当的mumbo jumbo。

WELL ...

我现在已经设置了WYSIWYG ....所以如果我们的一个技术人员使用所见即所得来创建一个正确的链接方式...它自动创建代码....然后clickableurls函数也找到了已经在文本中的http并将其转换为AGAIN ...

所以我基本上试图找出处理它的最佳方法。我确实想要两个选项......并且正在考虑做一个IF语句,但是不会更改preg_replace会更有意义吗?

有什么想法?再次感谢溢出社区!

1 个答案:

答案 0 :(得分:3)

我可以尝试帮助您翻译第一个preg_replace()正则表达式中的内容 这是我能做的最好的事情,因为我不知道你的意图。我推断了一些意图,
但由你来决定。

当正则表达式很复杂时,块格式化有助于轻松查看复杂性。

([^(\'|")]((f|ht){1}tp(s?):\/\/)[-a-zA-Z0-9@:%_\+.~#?&;\/\/=]+[^(\'|")])

(                                    # Capture group 1
    [^'"]                                # Consume a character that is not single nor double quote
    (                                    # Capture group 2
      (?:ftp|https?):                       # Either ftp, OR http (optional s) string literal
      //                                    # Literl double forward shashes
    )                                    # End capt grp 2
    [-a-zA-Z0-9@:%_+.~#?&;/=]+           # 1 or more (greedy) of the characters in this class
    [^'"]                                # Consume a character that is not single nor double quote
)                                    # End capt grp 1