2010-09-25 61 views
1
$bits = preg_split('#((?:https?|ftp)://[^\s\'"<>()]+)#S', $token->data, -1, PREG_SPLIT_DELIM_CAPTURE); 

说,我试图匹配需要链接的网址。以上是过于宽容。如何在PHP中将正则表达式与正则表达式匹配?

我想只匹配像http://google.com简单URL,但不<a href="http://google.com">http://google.com</a>,或<iframe src="http://google.com"></iframe>

+0

你能解释一下你正在尝试做的,最后? – Tomalak 2010-09-25 09:36:35

+0

我试图链接网址,只有在必要**时才用“ **”包装它。 – wamp 2010-09-25 09:46:05

+0

我以为是。这个问题在这里被问了几十次。请[考虑搜索](http://stackoverflow.com/search?q=),其中一个答案可能只是做你想做的。 – Tomalak 2010-09-25 10:59:26

回答

2

看来,你试图使用正则表达式来解析HTML。 You might want to rethink that.

+0

如何在解析html的字符串中匹配url? – grapefrukt 2010-09-25 08:46:17

+3

您正在匹配HTML上下文中的网址。将HTML加载到DOMDocument中,然后根据模式测试每个文本节点。 – 2010-09-25 08:50:04

+0

我不明白这个链接的答案如何解决我的问题,尽管.. – wamp 2010-09-25 09:20:08

0

试试这个...

function validUrl($url){ 
     $return=FALSE; 
     $matches=FALSE; 
     $regex='#(^';     #match[1] 
     $regex.='((https?|ftps?)+://)?'; #Scheme match[2] 
     $regex.='(([0-9a-z-]+\.)+'; #Domain match[5] complete match[4] 
     $regex.='([a-z]{2,3}|aero|coop|jobs|mobi|museum|name|travel))'; #TLD match[6] 
     $regex.='(:[0-9]{1,5})?'; #Port match[7] 
     $regex.='(\/[^ ]*)?'; #Query match[8] 
     $regex.='$)#i'; 
     if(preg_match($regex,$url,$matches)){ 
      $return=$matches[0]; $domain=$matches[4]; 
      if(!gethostbyname($domain)){ 
       $return = FALSE; 
      } 
     } 
     if($return==FALSE){ 
      return FALSE; 
     } 
     else{ 
      return $matches; 
     } 
    } 
+0

我已经更新了问题以清楚说明。 – wamp 2010-09-25 08:18:59

+2

在这种情况下,更复杂的正则表达式如何提供帮助?再次阅读问题。 – Tomalak 2010-09-25 08:21:01

+1

无论如何,试图列举“有效”的顶级域名是徒劳无益的。 – bobince 2010-09-25 08:55:03

0

RE

http:\/\/[a-zA-Z0-9\.\-]* 

结果

Array 
(
    [0] => http://google.com 
) 
0

更有效RE

[hf]t{1,2}p:\/\/[a-zA-Z0-9\.\-]* 

结果

Array 
(
    [0] => Array 
     (
      [0] => ftp://article-stack.com 
      [1] => http://google.com 
     ) 
)