将许多网址替换为链接

时间:2012-08-18 16:15:12

标签: php url hyperlink str-replace preg-match-all

这是我的代码:

$post = $_POST['test'];
$pattren='/((([http]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\/+=&#?;%@,.\w_]*)#?(?:[\w]*)?))/';
preg_match_all( $pattren, $post, $matches);

foreach($matches[0] as $match) {
    $images[]= "<a href=\"$match\" target=\"_blank\" >$match</a> ";
}

for ($i = 0, $c = count($images); $i < $c; $i++) {
    $html_links = str_replace($pattren,$images[$i], $post);
}

echo $html_links;

我正在尝试从$post获取所有网址并将其转换为链接,但有些错误。

2 个答案:

答案 0 :(得分:2)

此代码存在许多问题,包括:

不确定你的正则表达式($pattren)来自哪里,但看起来对我来说完全是胡言乱语 - [http]{3,9}:表示“任何字符'h','t',或'p',重复3到9次,然后是冒号“ - 所以它会匹配”thppppppt:“,这看起来不像我的URL的开头。

str_replace与正则表达式无关,因此str_replace($pattren, ...正在输入中查找该正则表达式的文本。

实际上,我不确定你期望在该循环中发生什么替换,因为你已经将$match复制到了字符串的正确部分。

每次围绕第二个循环,你都在覆盖变量$html_links。除非没有显示代码,否则也不需要2个循环 - 您只需在foreach循环中构建字符串并完全取消$images数组。

而且,顺便提一下,你拼错了“模式”,并且使用了不一致的约束 - 有些人更喜欢自己的{行,有些人更喜欢for行/ foreach,但您已管理其中一个。 [虽然这些都不会影响代码]

答案 1 :(得分:0)

使用preg_replace()

$post = $_POST['test'];
$pattren='%\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))%s';
$html_links = preg_replace($pattren, '<a href="$1" target="_blank">$1</a>', $post);
echo $html_links;

使用here中的良好模式进行了更新。