Twitter样式URL正则表达匹配

Moe*_*Moe 3 php regex url preg-replace preg-match

我正在尝试使用PHP为聊天客户端实现非常宽松的Regex匹配.

聊天客户端必须能够获取完整和不完整的URL.

例如:

http://www.example.comwww.example.comexample.com

我已经设置了一个试图实现这个目的的preg_replace:

$find = array("/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/is","/(^(?!http:\/\/)[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,4}(\/?\S*)?)/is");
$replace = array( "<a target=\"_blank\" href=\"http://\\1\">\\1</a>","<a target=\"_blank\" href=\"\\1\">\\1</a>");
$output = preg_replace($find, $replace, $input); 
Run Code Online (Sandbox Code Playgroud)

因此,目标是首先找到带有协议的"完整"URL,然后尝试查找没有协议的"懒惰"URL.

目前它适用于"完整"网址,但"懒惰"网址无法获取.

任何帮助将不胜感激.

谢谢.

gho*_*oti 5

我刚才建立了类似的东西.我的想法是......以协议标识符或"www"开头的任何内容都是一个URL,以及与以有效TLD(两个字母或已知gTLD)结尾的域相匹配的任何内容(如果后跟路径).域本身就是域.

$gtlds="com|net|org|biz|edu|gov|int|pro|xxx";
$gtlds+="|aero|arpa|asia|coop|museum|name|travel";
#$gtlds+="|xn-[a-z0-9]+";
$a = array(
  '/(f|ht)tps?:\/\/[^ ]+/',
  '/(ftp|www)\.[a-z0-9.-]+(/[^ ]*)/',
  "/([a-z0-9][a-z0-9-]*\.)+([a-z]{2}|$gtlds)\/[^ ]*/"
);
Run Code Online (Sandbox Code Playgroud)

请注意,我是一个老式的正则表达式用户,所以这是ERE,而不是所有孩子们现在使用的那种花哨的PREG东西.

荒谬的gTLD列表来自IANA.我已经对它进行了更新,因此除了这个答案之外它的有效时间是有效的.XN--*.您可以根据需要包含以TIP开头的TLD列表.XN--,无论是使用模式还是直接匹配它们并增加$gtlds变量.我从来没有遇到任何因忽略它们的存在而引起的问题,所以这就是我的策略.

以上RE适用于我的具体用途.我没有声称他们会为每一个不属于我的案件工作.(例如,如果引用域或URL,它们将包括尾随引号.这绝不是我必须处理的事情,因此我没有处理它.)

请注意,当您进行替换时,虽然您希望生成器锚点的HREF属性是您匹配或生成的URL,但您可能希望保留原始文本,以便进行布局和显示.

根据你如何使用这些,字边界可能会有所帮助......但你已经知道如何做到这些.