2013-07-01 14 views
1

我们用下面的正则表达式的URL转换成文本链接,这是缩短了与中间省略号如果他们是太长:正则表达式解析的网址链接,但前提是他们都没有联系尚未

/** 
* Replace all links with <a> tags (shortening them if needed) 
*/ 
$match_arr[] = '/((http|ftp)+(s)?:\/\/[^<>\s,!\)]+)/ie'; 
$replace_arr[] = "'<a href=\"\\0\" title=\"\\0\" target=\"_blank\">' . " . 
    "(mb_strlen('$0') > {$maxlength} ? mb_substr('$0', 0, " . ($maxlength/2) . ") . '…' . " . 
    "mb_substr('$0', -" . ($maxlength/2) . ") : '$0') . " . 
"'</a>'"; 

这是工作。然而,我发现,如果在一个链接的文本已经,如:

$text = '... <a href="http://www.google.com">http://www.google.com</a> ...'; 

它将匹配的网址,所以它会尝试创建两个<a>标签,完全搞乱了当然的DOM 。

我怎样才能防止正则表达式匹配,从如果链接已经是一个<a>标签里面?它也将在title属性中,所以基本上我只想完全跳过每个<a>标签。

+0

如何剥离所有锚标签的第一,而不必以过分复杂化当前的正则表达式? – ccKep

+1

_Or_如何解析DOM,处理nodeValues,并_skipping_所有'了'标签,这是我们如何处理标记:通过解析它 –

+0

这是个好主意,但你会怎么做呢? ['strip_tags'(http://php.net/manual/en/function.strip-tags.php)只允许标签白名单.. – Rijk

回答

1

最简单的方法(用一个正则表达式,这可以说是不是在这种情况下,最可靠的工具)很可能会确保没有</a>你的链接后如下:

#(http|ftp)+(s)?://[^<>\s,!\)]++(?![^<]*</a>)#ie 

我使用possessive quantifiers以确保整个URL将匹配(即为了满足前瞻而没有回溯)。

+0

有一个')'失踪的地方.. – Rijk

+0

权。外括号可以完全删除。 –

相关问题