用于图像和链接的URL的正则表达式

时间:2011-03-21 14:26:34

标签: php regex preg-replace

编辑:我没有解析像已发布的50亿个其他问题的HTML。这是原始的无格式文本,我想将其转换为一些HTML。

我正在进行后期处理。我需要将带有图像结尾的URL(jpe?g | png | gif)转换为图像标记,将所有其他Urls转换为href链接。我的图像替换是正确的,但是我仍然坚持让链接替换不要试图互相覆盖。

我需要帮助表达式如何在没有替换图像的标签的情况下查找网址,或者查找不以点jpe结尾的网址?g | png | gif。

public function smartConvertPost($post) {

    /**
     * Match image based urls
     */
    $pattern = '!http://([a-z0-9\-\.\/\_]+\.(?:jpe?g|png|gif))!Ui';
    $replace='<p><img src="http://$1"></p>';
    $postImages = preg_replace($pattern,$replace,$post);

    /**
     * Match url based
     */
    $pattern='/http://([a-z0-9\-\.\/\_]+(?:\S|$))/i';
    $replace='<a href="$1">$1</a>';
    $postUrl = preg_replace($pattern,$replace, $postImages);

return $postUrl;
}

请注意我不是在谈论匹配标签或HTML。匹配一个像这样的字符串并将其转换为html。

If this was an example post with a Url to a page like http://www.some-website.com/some-page/anything.html and I also put a url to an image http://www.some-website.com/someimage.jpg you would need to regex the two to be a hyperlink and an image. 

谢谢,

3 个答案:

答案 0 :(得分:3)

布拉德·克里斯蒂的preg_replace_callback()推荐是一个很好的建议。这是一个可能的实现:

function smartConvertPost($post)
{ // Disclaimer: This "URL plucking" regex is far from ideal.
    $pattern = '!http://[a-z0-9\-._~\!$&\'()*+,;=:/?#[\]@%]+!i';
    $replace='_handle_URL_callback';
    return preg_replace_callback($pattern,$replace, $post);
}

function _handle_URL_callback($matches)
{ // preg_replace_callback() is passed one parameter: $matches.
    if (preg_match('/\.(?:jpe?g|png|gif)(?:$|[?#])/', $matches[0]))
    { // This is an image if path ends in .GIF, .PNG, .JPG or .JPEG.
        return '<p><img src="'. $matches[0] .'"></p>';
    } // Otherwise handle as NOT an image.
    return '<a href="'. $matches[0] .'">'. $matches[0] .'</a>';
}

请注意,用于拔出URL的正则表达式并不理想。做得对是很棘手的。请参阅以下资源:

修改:添加了识别具有查询或片段的图片网址的功能。

答案 1 :(得分:1)

由于这是关于这类主题的第215247篇帖子,让我们再说一遍:HTML太复杂了,无法使用正则表达式。使用解析器。 看到这个。 Regular expression for parsing links from a webpage?

PS:没有冒犯=)。

编辑:

我个人经常使用symfony,并且有一个非常好的解析器可以满足您的需求:http://fabien.potencier.org/article/42/parsing-xml-documents-with-css-selectors

您可以在html上使用简单的css表达式获取所有图像。试一试。

答案 2 :(得分:0)

使用标记怎么样?


public function smartConvertPost($post) {
    $MY_MARKER="<MYMARKER>"; // Define the marker here

    /**
     * Match image based urls
     */
    $pattern = '!http://([a-z0-9\-\.\/\_]+\.(?:jpe?g|png|gif))!Ui';
    $replace='<p><img src="$MY_MARKERhttp://$1$MY_MARKER"></p>'; // Use it here...
    $postImages = preg_replace($pattern,$replace,$post);

    /**
     * Match url based
     */
    $pattern='/(?<!$MY_MARKER)http://([a-z0-9\-\.\/\_]+(?:\S|$))(?!$MY_MARKER)/i';//...here
    $replace='<a href="$1">$1</a>';
    $postUrl = preg_replace($pattern,$replace, $postImages);


    /**
     * Remove all markers
     */
    $postUrl = str_replace( $MY_MARKER, '', $postUrl);

    return $postUrl;
}

尝试选择一个在帖子中没有机会aapear的标记。 HTH