标题这样不知道合适不合适。具体的情况是这样的:网站要增加关键字链接功能,然后需要对文章的内容进行正则表达式匹配并替换,然后使用了preg_replace函数。替换的程序代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
function ReplaceKeyword( $linkDefs , $content ){
$linkMap = array ();
/*foreach($linkDefs as $row) {
$linkMap[] = explode(',', $row);
}*/
$linkMap = $linkDefs ;
//把原有的链接替换成文字
foreach ( $linkMap as $row ) {
$content = preg_replace( '/(<a.*?>\s*)(' . $row [0]. ')(\s*<\/a>)/sui' , $row [0], $content );
}
//关键字从长至短排序
usort( $linkMap , '_sortDesc' );
//var_dump($linkMap);
$tmpKwds = array (); //存放暂时被替换的子关键字
$k_count =0;
foreach ( $linkMap as $i => $row ) {
list( $kwd , $url ) = $row ;
for ( $j = $i +1; $j < count ( $linkMap ); $j ++) {
$subKwd = $linkMap [ $j ][0];
//如果包含其他关键字,暂时替换成其他字符串,如 茶叶 变成
if ( strpos ( $kwd , $subKwd ) !== false) {
$tmpKwd = '' ;
$kwd = str_replace ( $subKwd , $tmpKwd , $kwd );
$tmpKwds [ $tmpKwd ] = $subKwd ;
}
}
//把文字替换成链接
require (MLEINC. '/config/globals.config.php' );
$th_num = $config [ 'keyword_num' ]; //关键字替换次数
$content = preg_replace( '/(' . $row [0]. ')/sui' , '<a href="' . $row [1]. '">' . $kwd . '</a>' , $content , $th_num , $count ); // 所有的匹配项都会被替换
$k_count += $count ;
}
//把代替子关键字的字符串替换回来
foreach ( $tmpKwds as $tmp => $kwd ) {
$content = str_replace ( $tmp , $kwd , $content );
}
$result = array ( $content , $k_count );
return $result ;
unset( $result );
unset( $tmp );
unset( $tmpKwds );
unset( $kwd );
unset( $count );
unset( $config );
unset( $linkMap );
unset( $linkDefs );
unset( $tmpKwd );
unset( $content );
unset( $th_num );
unset( $row );
unset( $k_count );
}
|
程序是从网上找的,然后在本地测试是正常的,本地环境为php 5.3 服务是5.2的,上传到网上去后,提交则显示空白,一开始考虑是PHP版本问题,以为是ereg preg的区别,替换后还是不行。后来网上看,发现有网友说调整大pcre.backtrack_limit和pcre.recursion_limit就行,我试了下,果然可以了。看来是配置问题,不过一般情况下,PHP的默认配置应该没啥问题,我自己写的这程序还是不够好!