Php 从推文中查找URL、@回复和#标签
我正在用PHP构建一个Twitter小东西,我正在尝试解析URL、@repress和#hashtags,并将它们变成可点击的链接Php 从推文中查找URL、@回复和#标签,php,regex,text,twitter,Php,Regex,Text,Twitter,我正在用PHP构建一个Twitter小东西,我正在尝试解析URL、@repress和#hashtags,并将它们变成可点击的链接 @repress将链接到 Hashtags希望 我发现了一个用于解析URL的类,我想知道这是否也可以用于解析@reply和#hashtags: // http://josephscott.org/archives/2008/11/makeitlink-detecting-urls-in-text-and-making-them-links/ class
- @repress将链接到
- Hashtags希望
// http://josephscott.org/archives/2008/11/makeitlink-detecting-urls-in-text-and-making-them-links/
class MakeItLink {
protected function _link_www( $matches ) {
$url = $matches[2];
$url = MakeItLink::cleanURL( $url );
if( empty( $url ) ) {
return $matches[0];
}
return "{$matches[1]}<a href='{$url}'>{$url}</a>";
}
public function cleanURL( $url ) {
if( $url == '' ) {
return $url;
}
$url = preg_replace( "|[^a-z0-9-~+_.?#=!&;,/:%@$*'()x80-xff]|i", '', $url );
$url = str_replace( array( "%0d", "%0a" ), '', $url );
$url = str_replace( ";//", "://", $url );
/* If the URL doesn't appear to contain a scheme, we
* presume it needs http:// appended (unless a relative
* link starting with / or a php file).
*/
if(
strpos( $url, ":" ) === false
&& substr( $url, 0, 1 ) != "/"
&& !preg_match( "|^[a-z0-9-]+?.php|i", $url )
) {
$url = "http://{$url}";
}
// Replace ampersans and single quotes
$url = preg_replace( "|&([^#])(?![a-z]{2,8};)|", "&$1", $url );
$url = str_replace( "'", "'", $url );
return $url;
}
public function transform( $text ) {
$text = " {$text}";
$text = preg_replace_callback(
'#(?<=[\s>])(\()?([\w]+?://(?:[\w\\x80-\\xff\#$%&~/\-=?@\[\](+]|[.,;:](?![\s<])|(?(1)\)(?![\s<])|\)))*)#is',
array( 'MakeItLink', '_link_www' ),
$text
);
$text = preg_replace( '#(<a( [^>]+?>|>))<a [^>]+?>([^>]+?)</a></a>#i', "$1$3</a>", $text );
$text = trim( $text );
return $text;
}
}
//http://josephscott.org/archives/2008/11/makeitlink-detecting-urls-in-text-and-making-them-links/
类MakeItLink{
受保护的功能链接www($matches){
$url=$matches[2];
$url=MakeItLink::cleanURL($url);
if(空($url)){
返回$matches[0];
}
返回“{$matches[1]}”;
}
公共函数cleanURL($url){
如果($url=''){
返回$url;
}
$url=preg_replace(“|[^a-z0-9-~+.?#=!&;/:%@$*”()x80 xff]| i“,”$url);
$url=str_replace(数组(“%0d”,“%0a”),“”,$url);
$url=str_replace(“;/”,“:/”,$url);
/*如果URL似乎不包含方案,我们将
*假设它需要http://added(除非是亲戚
*以/或php文件开头的链接)。
*/
如果(
strpos($url,“:”)===false
&&substr($url,0,1)!=“/”
&&!preg|u match(“| ^[a-z0-9-]+?.php|i”,$url)
) {
$url=“http://{$url}”;
}
//替换符号和单引号
$url=preg_replace(“|&([^#])(?![a-z]{2,8};)|“,”&;$1“,$url);
$url=str_替换(“'”、“';”、$url);
返回$url;
}
公共功能转换($text){
$text=“{$text}”;
$text=preg\u replace\u回调(
“#(?)(\()([\w]+?:/(?:[\w\\x80-\\xff\\\\\\\$%&~/\-=?@\[\](+):(?![\s))]+?>([^>]+?)\i',“$1$3”,$text);
$text=修剪($text);
返回$text;
}
}
我认为您要做的基本上就是我在下面介绍的内容。您应该在transform
方法中,在return语句之前添加这两条语句
$text = preg_replace('#@(\w+)#', '<a href="http://twitter.com/$1">$0</a>', $text);
$text = preg_replace('/#(\w+)/', '<a href="http://twitter.com/search?q=%23$1&src=hash">$0</a>', $text);
$text=preg#u replace('#@(\w+)#',''$text);
$text=preg#u replace(“/”(\w+/”,“$text”);
这就是你要找的吗?Twitter可以开源和()实现他们用来查找用户名、哈希标记、列表和URL的代码
它非常面向正则表达式。这里有问题吗?你对这段代码有问题吗?是的,这个类只解析链接,我也想解析@repress和#hashtags并将它们转换为link。我喜欢这个实现有多简单。更正!嗨@SoaperGEM,这没有考虑hashtags中的特殊字符,比如说,它不适用于#Prévoyance之类的词。有什么解决办法吗?