【问题标题】:replace many urls into links将许多网址替换为链接
【发布时间】:2012-08-14 17:58:11
【问题描述】:

这是我的代码:

$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 获取所有 url 并将它们转换为链接,但有问题。

【问题讨论】:

  • 不应该 $pattren$pattern 吗? (哎呀,刚刚注意到 IMSoP 提到了这一点)

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


【解决方案1】:

使用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 的良好模式进行了更新。

【讨论】:

  • 虽然这消除了我提到的大部分问题代码,但我仍然不相信该正则表达式的用处。
  • 我没有检查模式,但修改了。检查答案
  • 好吧,我花了一段时间才弄明白为什么,但是,是的,这行得通。我看到这里有一个更新(并且解释得更好)的版本:daringfireball.net/2010/07/improved_regex_for_matching_urls
【解决方案2】:

这段代码有很多问题,包括:

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

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

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

您每次在第二个循环时都会覆盖变量$html_links。也不需要 2 个循环,除非没有显示代码 - 您可以简单地在 foreach 循环中构建字符串并完全取消 $images 数组。

而且,顺便说一句,你拼错了“pattern”,并且为你的花括号使用了不一致的约定 - 有些人更喜欢 { 单独一行,有些人喜欢 for/foreach ,但您已经管理了其中的一个。 [不过,这些都不会影响代码]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多