0

这是我的代码:

$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;

我正在尝试从中获取所有 url$post并将它们转换为链接,但是出了点问题。

4

2 回答 2

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,但你已经管理了每一个。[不过,这些都不会影响代码]

于 2012-08-18T16:29:18.740 回答
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;

从这里更新了一个好的模式。

于 2012-08-18T16:20:32.840 回答