이 제목이 적절한지 아닌지 모르겠습니다. 구체적인 상황은 다음과 같습니다. 웹 사이트에서 키워드 링크 기능을 추가하려고 하는데 기사의 내용을 일치시키고 정규 표현식으로 대체한 다음 preg_replace 기능을 사용합니다. 대체된 프로그램 코드는 다음과 같습니다.
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이었는데, 인터넷에 올려보니 처음엔 PHP 버전인 줄 알았어요. 문제이고 그것이 ereg라고 생각했습니다. preg의 차이점은 교체 후에도 여전히 작동하지 않습니다. 나중에 인터넷을 찾아보니 일부 네티즌들이 pcre.backtrack_limit과 pcre.recursion_limit만 조정하면 충분하다고 말하는 것을 발견했고, 효과가 있었습니다. 설정 문제인 것 같지만, 일반적인 상황에서는 PHP의 기본 설정으로는 문제가 없을 것입니다. 제가 직접 작성한 프로그램은 아직 충분하지 않습니다.