0

可能重复:
将 url 从字符串转换为链接,除非它们位于 html 标记的属性中

我正在寻找有关 PHP 正则表达式的帮助。

我正在为仅限邀请的博客创建一个输入页面,所以我不需要担心垃圾邮件发送者。我想让人们添加 URL 变得简单,但我也想让他们能够使用 HTML 标记,如果这让他们高兴的话。

在下面的示例中,$text 变量包含三个链接。我想<a > ... </a>围绕前两个创建标签,但第三个已经有这些标签,所以我想不管它。我的正则表达式适用于最后两种情况,但不是第一种。

我的正则表达式开头[^<a href *?= *?\'\"]我想说“如果字符串以<a href='>(或类似)开头,则不要创建匹配项,但这不是它在实践中的工作方式。在这里,^行为作为“行首”字符而不是作为否定者。

我希望输出看起来像这样:

Visit <a ...>http://www.example.com/</a> for more info.

<a ...>http://www.example.com/index.php?q=regex</a>

Here is a <i><a ...>link</a> to visit</i>.

提前感谢您对重写正则表达式的任何帮助。

詹姆士

<?php
$text = "Visit http://www.example.com/ for more info.

http://www.example.com/index.php?q=regex

Here is a <i><a href='http://www.google.ca/search?q=%22php+regex%22&hl=en'>link</a> to visit</i>.";

// Ignore fully qualified links but detect bare URLs...
$pattern = '/[^<a href *?= *?\'\"](ftp|https?):\/\/[\da-z\.-]+\.[a-z\.]{2,6}[\/\.\?\w\d&%=+-]*\/?/i';

// ... and replace them with links to themselves
$replacement = "<a href='$0'>$0</a>";

$output = preg_replace($pattern, $replacement, $text);

// Change line breaks to <p>...</p>...
$output = str_replace("\n", "", $output);
$output = "<p>".str_replace("\r", "</p><p>", $output)."</p>";

// Allow blank lines
$output = str_replace("<p></p>", "<p>&nbsp;</p>", $output);

// Split the paragraphs logically in the HTML
$output = str_replace("</p><p>", "</p>\r<p>", $output);

echo $output;
?>
4

0 回答 0