我正在进行后期处理。我需要将带有图像结尾的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.
谢谢,
答案 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