帝国论坛帝国网站管理系统交流区帝国CMS使用交流[求助]如何禁止内容关键字替换ALT和A标签中的关键词? 【本版专题贴子】  
 1/2     1 2 ›› ›|
主题:[求助]如何禁止内容关键字替换ALT和A标签中的关键词? [加入收藏夹]   

bluethlip
用户头衔:秀才

精华贴   :0
发贴数   :45
经验值   :341
注册时间:2009-07-24
信息 搜索 好友 发送悄悄话 精益求精-帝国网站管理系统7.5正式版开源发布】   [第 1 楼]
[求助]如何禁止内容关键字替换ALT和A标签中的关键词?
求解

1、关键字替换如何避免IMG标签里的ALT字段被替换
2、在内容中,我手动添加的一些链接中含有关键字,如何避免这个关键字被替换!

例子:
1、不要说设置里设置替换次数为1,如果是1也是从开头算起,如果ALT标签里的关键字是本文第一次出现,设置1就无效了
2、比如我文章中加入了另一篇文章的链接,比如标题是《帝国cms模板中E:LOOP的用法介绍》,这个标题链接到对应的另一文章,但是帝国CMS模板,这个词会被系统自动替换掉,影响自己手动添加的链接!

有没有什么好的方法解决这些问题呢!

高手交流下!

[该贴被修改 1 次,最后修改时间 2013-12-03 16:27:02 ]



2013-12-03 14:33:34 已设置保密 顶部 回复 引用 报告 编辑 删除

ibook
用户头衔:探花

精华贴   :0
发贴数   :2176
经验值   :6379
注册时间:2010-06-29
信息 搜索 好友 发送悄悄话 免费开源-EBMA系统:更安全的MYSQL管理和备份系统】   [第 2 楼]

好像没啥好办法




2013-12-03 15:26:41 已设置保密 顶部 回复 引用 报告 编辑 删除

shunfull
用户头衔:书生

精华贴   :0
发贴数   :8
经验值   :48
注册时间:2010-06-27
信息 搜索 好友 发送悄悄话 精益求精-帝国网站管理系统7.5正式版开源发布】   [第 3 楼]

好方法分享给你吧(网上找到的):
仅限于系统设置了替换次数,实际上从seo来说不建议把整篇文章都替换,那样页面中如果出现关键字过多,那么相同连接就泛滥了,如果你系统设置中设置的替换成1次,2次,只要不是0,那么修改e/class/functions.php中的ReplaceKey函数,425行,修改如下:


原函数:
$newstext=empty($public_r[repkeynum])?str_replace($r[keyname],'<a href='.$r[keyurl].' target=_blank class=infotextkey>'.$r[keyname].'</a>',$newstext):preg_replace('/'.$r[keyname].'/','<a href='.$r[keyurl].' target=_blank class=infotextkey>'.$r[keyname].'</a>',$newstext,$public_r[repkeynum]);

修改后的:
$newstext=empty($public_r[repkeynum])?str_replace($r[keyname],'<a href='.$r[keyurl].' target=_blank class=infotextkey>'.$r[keyname].'</a>',$newstext):preg_replace('/(?!<[^>]*)'.$r[keyname].'(?![^<]*>)/','<a href='.$r[keyurl].' target=_blank class=infotextkey>'.$r[keyname].'</a>',$newstext,$public_r[repkeynum]);
preg_replace是正则判断,就用正则表达式把<>里面的排除掉。这样一来问题就解决了。
修改前记得备份,改坏了不负责。 本方法干净大方,无累赘,不增加负担~
ecms 6.6通过。[b][/b][color=Red][/color]



上传以下图片:





2014-04-13 22:14:07 已设置保密 顶部 回复 引用 报告 编辑 删除

shunfull
用户头衔:书生

精华贴   :0
发贴数   :8
经验值   :48
注册时间:2010-06-27
信息 搜索 好友 发送悄悄话 免费开源-EBMA系统:更安全的MYSQL管理和备份系统】   [第 4 楼]

到了帝国CMS7.0,修改方法比较类似,但需要替换两个地方,替换后的样子如图:


上传以下图片:





2014-04-13 22:16:48 已设置保密 顶部 回复 引用 报告 编辑 删除

shunfull
用户头衔:书生

精华贴   :0
发贴数   :8
经验值   :48
注册时间:2010-06-27
信息 搜索 好友 发送悄悄话 精益求精-帝国网站管理系统7.5正式版开源发布】   [第 5 楼]

警告!!
在修改时一定要留一个functions.php备份,因为非常容易修改错!!
一定要睁大眼睛,多一个或少一个点句、引号、斜杠都有可能造成修改不成功甚至边帝国后台也进不去!!

如果你想偷懒,而且留有functions.php备份,你可以直接用写字板打开它,用查找替换功能:
查找内容:
/'.$r[keyname].'/
替换内容:
/(?!<[^>]*)'.$r[keyname].'(?![^<]*>)/

帝国CMS7.0要替换两次,7.0以下只需要替换一次。




2014-04-13 22:22:26 已设置保密 顶部 回复 引用 报告 编辑 删除

shunfull
用户头衔:书生

精华贴   :0
发贴数   :8
经验值   :48
注册时间:2010-06-27
信息 搜索 好友 发送悄悄话 免费开源-EBMA系统:更安全的MYSQL管理和备份系统】   [第 6 楼]

你的第二个问题,我尝试过按上述思路进行修改,但未成功,应该是我正规表达式的功力不行吧。哪位大牛可以完善一下?

preg_replace('/((?!<[^>]*)|(?!(">)[^(</a>)]*))'.$r[keyname].'((?![^<]*>)|(?![^(">)]* (</a>)))/','<a href='.$r[keyurl].' target=_blank class=infotextkey>'.$r[keyname].'</a>',$newstext,$public_r[repkeynum]);



上传以下图片:





2014-04-13 22:56:37 已设置保密 顶部 回复 引用 报告 编辑 删除

shunfull
用户头衔:书生

精华贴   :0
发贴数   :8
经验值   :48
注册时间:2010-06-27
信息 搜索 好友 发送悄悄话 精益求精-帝国网站管理系统7.5正式版开源发布】   [第 7 楼]

可能参照到的正规表达式技巧:

不以某某开头 ,比如不以www开头


Java code
public class Test {
    public static void main(String[] args) {
        String[] strs = { "abc1232", "wwwadsf", "awwwfas", "wwadfsf", "", "ww", " ", "www" };
        String regex = "(?:(?!^www).)*";
        for(String str : strs) {

            System.out.printf("%-7s %s%n", str, str.matches(regex));
        }
    }
}


(?!X) 专业名称为 Negative Lookahead,表示字符间缝隙后面不允许出现的字符,
即匹配字符间的缝隙,如果缝隙后的字符不是 X 的话,那这个缝隙就匹配成功。

举个例子,aab 和 aac,现有表达式 aa(?!b) 这时我们能匹配到的字符串是 aac,
因为 aa 的后面的缝隙之后不允许出现字符 b,因此只有 aac 进行了匹配。

再来看个示例:

Java code

public class Test {
    public static void main(String[] args) {
        String str = "AQuickBrownFoxJumpsOverTheLazyDog";
        String[] strs = str.split("(?<!^)(?=[A-Z])");
        for(String s : strs) {
            System.out.println(s);
        }
    }
}


根据大写字母拆分字符串。当然了,这个使用字符串进行分析同样也能进行拆分,
但是使用正则表达式来拆的话更为便捷直观一些。

在进行这种拆分时,由于在拆分后的字符数不能减少,因此只能使用零宽度的
lookaround 功能进行匹配,lookaround 包括四个,即:

Java code
(?=X) (?!X) (?<=X) (?<!X)


来看一下这个表达式:(? <!^)(?=[A-Z])

前面说到过 (?!) 表示缝隙后面不允许出现的东西,而 (? <!) 表示缝隙前不允许出现的东西。
(?=) 表示缝隙后允许出现的东西,(? <=) 表示缝隙前允许出现的东西。

这个表达式在拆分时,根据零宽度匹配缝隙进行拆分的,这个缝隙必须满足以下条件:

(? <!^) 表示缝隙不允许前不能是行开始,即缝隙不能出现在首字母的前面。
(?=[A-Z]) 表示缝隙后面允许出现 A-Z 的大写字母。

这时这个表达式就匹配了下面带有 | 的缝隙:

Java code
A|Quick|Brown|Fox|Jumps|Over|The|Lazy|DogPS:不加 (?<!^) 的话,会变成:|A|Quick|Brown|Fox|Jumps|Over|The|Lazy|Dog


根据 split 的功能,正则表达式处理程序就根据上面的 | 将字符串给拆分开来了。




2014-04-13 22:58:24 已设置保密 顶部 回复 引用 报告 编辑 删除

零距离
用户头衔:探花

精华贴   :0
发贴数   :4834
经验值   :12848
注册时间:2007-12-26
信息 搜索 好友 发送悄悄话 免费开源-EBMA系统:更安全的MYSQL管理和备份系统】   [第 8 楼]

学习




2014-04-14 07:45:15 已设置保密 顶部 回复 引用 报告 编辑 删除

lyingjie
用户头衔:举人

精华贴   :0
发贴数   :192
经验值   :746
注册时间:2008-09-11
信息 搜索 好友 发送悄悄话 精益求精-帝国网站管理系统7.5正式版开源发布】   [第 9 楼]

坐等正则,我也是复杂的正则就不行了



http://www.xxinrui.com
2015-04-20 09:08:21 已设置保密 顶部 回复 引用 报告 编辑 删除

rioself
用户头衔:秀才

精华贴   :0
发贴数   :130
经验值   :497
注册时间:2010-03-22
信息 搜索 好友 发送悄悄话 免费开源-EBMA系统:更安全的MYSQL管理和备份系统】   [第 10 楼]

原帖由 shunfull 于 2014-04-13 22:16:48 发表
到了帝国CMS7.0,修改方法比较类似,但需要替换两个地方,替换后的样子如图:


请问这种方法,能否取消替换掉图片alt里面的内容关键字?




2015-06-25 13:57:51 已设置保密 顶部 回复 引用 报告 编辑 删除
 1/2     1 2 ›› ›|

快速回复
内容

表情
使用EBB代码 使用smile代码 显示签名 自动分析url 自动分析img
     【进入高级模式】   (按 Ctrl+Enter 直接提交)
    顶部  加入收藏夹
关于帝国 | 广告服务 | 联系我们 | 法律声明 | 隐私条款 | 许可协议
Powered by: EBB Version 2.2.1