public static function filter_newslink($aid){
$content = mod_news :: get_newscont($aid);
//先过滤图片的外链 非贪婪匹配 普通正则用?,PHP用/U转变是否贪婪
$content = preg_replace('/]*)>(]*>)<\/a>/iU', '$2', $content);
//再过滤文字的外链文字为文字
$content = preg_replace('/]*)>([^<]*)<\/a>/iU', '$2', $content);
$data = array('news_id' => $aid, "content" => $content);
$status = mod_news :: update_newscontent($data);
return $status;
}
贪婪匹配(Greedy)是最大匹配,例如对于html字符串:
nowamagic.net is a good website to learn IT skills.
通过正则.*
默认匹配的结果为:
good website to learn
但许多情况下我们想要的其实是good 和 learn 两个匹配
解决的办法,就是上面说到的非贪婪匹配,即惰性匹配,它的语法如下表所示:
贪婪匹配 | 惰性匹配 | 匹配描述 |
? | ?? | 匹配 0 个或 1 个 |
+ | +? | 匹配 1 个或多个 |
* | *? | 匹配 0 个或多个 |
{n} | {n}? | 匹配 n 个 |
{n,m} | {n,m}? | 匹配 n 个或 m 个 |
{n,} | {n,}? | 匹配 n 个或多个 |
上述例子使用非贪婪匹配.*?
得到的结果为两个匹配,这次符合我们的需要了。
PHP正则表达式模式修正符:
这里是一个正则匹配的在线匹配测试工具:http://tool.oschina.net/regex
替换文章的关键词标签可以使用mysql导出后加工再导入数据库,也可以使用存储过程实现。这个的存储过程简单写一下:
delimiter //
create procedure replaceAllTag()
begin
declare i INT;
while i <=20 do
select replace(tag,",i,",",COSTi,") FROM `TBL_CMS_NEWS_bak` WHERE `col_id_related`=661 and tag like "%,i,%";
set i=i+1;
end while;
end //
delimiter ;
在PhpMyAdmin中,drop procedure replaceAllTag 需要单独执行,否则会报错。存储过程的语法请参照以下实例:
delimiter //
CREATE PROCEDURE `dadada` ()
BEGIN
DECLARE x INT;
DECLARE str VARCHAR(255);
SET x = 1;
SET str = '';
WHILE x <= 5 DO
SET str = CONCAT(str,x,',');
SET x = x + 1;
END WHILE;
SELECT str;
END //
delimiter ;
后来发现有些图片没有抓过来,而产品已经上线,重新抓取数据已是不现实的事情了。于是和同事协商后干脆把图片所在块一起去掉。攻略文章不再展示“卡牌数值”的图片表格。实现方法是采用MySQL的一些不太常用的函数。
SELECT replace(content,SUBSTRING(content FROM POSITION("卡牌数值" IN content) FOR POSITION("-->" IN content)),"
给定的表达式 | 返回类型 |
---|---|
text | varchar |
image | varbinary |
ntext | nvarchar |