php正则图片和表格替换的问题?

我现在还有一个比较复杂的功能高手能帮忙不,就是我想把文章中的关键字加链接,但是不给图片和表格中的关键字加链接应该怎么写?比如说文章内容是$content,关键字$keys... 我现在还有一个比较复杂的功能高手能帮忙不,就是我想把文章中的关键字加链接,但是不给图片和表格中的关键字加链接应该怎么写?比如说文章内容是$content,关键字$keys,我在$content中查找到$keys加上链接,但是不给图片和表格里的关键字加链接,因为图片中的alt可能和关键字重复,还有表格中的关键字我已经加链接了是不同的,$content中可能有多张图片和表格,应该怎么写呢? 展开
 我来答
彼德范
2014-01-17 · TA获得超过179个赞
知道小有建树答主
回答量:153
采纳率:40%
帮助的人:94.6万
展开全部

看看给你举的例子是不是你要的结果。分三步:1,把所有关键字替换成超链接;2,把表格里被替换的关键字再换成原样;3,把图片里被替换的关键字再换成原样。这样正则就不用写的很复杂了。

//现在要把$str里的关键字abc换成超链接,table和img里的除外。
$str = 'wwwabcwww<table><tr><td><a href="1.php">abc</a></td></tr><tr><td><a href="2.php">abc</a></td></tr></table>wwwabcwww<img src="xxx"alt="abc"/>wwwabcwww<table><tr><td><a href="3.php">abc</a></td></tr><tr><td><a href="4.php">abc</a></td></tr></table>wwwabcwww<img src="xxx"alt="abc"/>wwwabcwww';

//把所有的关键字abc都替换成超链接,不管哪里的关键字。
$str_new = preg_replace('/abc/i', '<a href="888.php">abc</a>', $str);

//把table里被换成超链接的关键字再换回去
$pattern_table = '/<table>.*?<\/table>/i';
preg_match_all($pattern_table, $str_new, $arr);
foreach ($arr[0] as &$val) {
$val = preg_replace('/<a href="888.php">abc<\/a>/i', 'abc', $val);
}
for ($i=0; $i<count($arr[0]); $i++) {
$pattern_table_arr[] = '/<table>.*?<\/table>/i';
}
$str_new = preg_replace($pattern_table_arr, $arr[0], $str_new, 1);

//把img里被换成超链接的关键字再换回去
$pattern_img = '/<img.*?>/i';
preg_match_all($pattern_img, $str_new, $arr);
foreach ($arr[0] as &$val) {
$val = preg_replace('/<a href="888.php">abc<\/a>/i', 'abc', $val);
}
for ($i=0; $i<count($arr[0]); $i++) {
$pattern_img_arr[] = '/<img.*?>/i';
}
$str_new = preg_replace($pattern_img_arr, $arr[0], $str_new, 1);

//查看替换后的结果
echo htmlentities($str_new);
更多追问追答
追问
我按照你写的试了下还是不对,表格中有个别的被替换了,还有图片的alt也被替换了
追答
把你的代码贴出来
jorsh
2014-01-17 · TA获得超过268个赞
知道小有建树答主
回答量:1103
采纳率:18%
帮助的人:215万
展开全部
根据你的意思,首先要排除图片和已经有链接的部分内容,用匹配的方法,把有图片和有链接的内容替换成别他的特殊内容,一定要是特殊的内容什么特殊的内容呢?自己想。然后把内容再替换关键为链接的内容,然后再把特殊的内容替换回来。此思路兼容性比较强,不尽表格里有链接的不替换,就是其他内容里有链接的也不替换。像他们回答的,只有其他内容里出现链接,而且链接里有关键字就很麻烦<a href="">ssdfdfs百度dfdfsdf</a>如果其他内容里有这个链接,然后你要替换的关键字是百度,结果就成了<a href="">ssdfdfs<a href="">百度</a>dfdfsdf</a>,你可以试着点点看看会出现什么效果。
所以推荐此方法。
更多追问追答
追问
高手能不能给个代码啊,新手没有那么强的逻辑能力!
追答

只给你关键的地方,其他的你自己补充

<?
function RepKeystoLinks($content){
  if(preg_match_all('/<img(.*?)>/si', $content, $imgarr)){ //匹配img内容
     foreach($imgarr[0] as $key =>$val){
        $comtent = str_replace($val, '<!--imglist-->', $content); //替换img内容为特特内容
     }
  }
  if(preg_match_all('/<a(.*?)<\/a>/si', $content, $alinkarr)){ //匹配a内容
     foreach($alinkarr[0] as $key =>$val){
        $comtent = str_replace($val, '<!--alinklist-->', $content); //替换a内容为特特内容
     }
  }
  $content = preg_replace('/关键字/i','<a ..>关键字</a>', $content); //替换所有关键字为链接
  //下面就把<!--imglist-->和<!--alinklist-->替换回原来的就行了,
  ...
  return $content;
}

?>
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lionet001
2014-01-17 · 超过11用户采纳过TA的回答
知道答主
回答量:18
采纳率:0%
帮助的人:26.1万
展开全部
你这个要求非常复杂,我自己做过,头疼死了。

1 建议:采用一个拆解html代码的库,能够把$content拆开成dom节点形式,这是最方便的。有个库甚至可以采用类jQuery语法来查找需要的节点。(好像就叫做:phpQuery)
然后就简单了,针对特定的节点进行替换。或者,检查节点,特殊节点不替换。
还可以要求不对属性(例如title)进行替换。
缺点:依赖库;执行效率可能会慢

2 自己拆解dom。当然,碰上table之类的,会非常讨厌,尤其是嵌套的节点。如果你能明确$content中,不会有太多嵌套的,就比较容易。
(1)通过正则,将一段html代码拆开成:标签前文字 + 标签("<>") + 标签后文字
(2)对标签后文字,进行递归,继续可以拆解为:标签前文字 + 标签("<>") + 标签后文字
(3)拆解过程中,对形成的标签,构造一个数组存放。有些标签是需要开始标签,和结束标签的。有些不需要。
最终,确定哪些标签中的文字不替换,哪些需要替换。
缺点:逻辑非常复杂,需要你思路比较清晰,代码能力比较强。不如第一个方法省事。
更多追问追答
追问
$content = preg_replace('/(?)([^img]+)?('.$nkeys.')/is','$1$2',$content);
我现在这么写可以不替换图片的关键字,但是表格我不知道该怎么加了?
追答
总的来说,如果你的content内容比较确定,结构比较简单,怎么都行。

比如,你可以先用正则,把除了table以外的字符串先取出来,再逐一用你的那个进行替换。

如果你指望用一个正则能做到,那可能性几乎没有。正则也不是万能的喽。既然这样,就应该分成不同的步骤去做。

(我上面写的那些,是考虑我当时面对的异常复杂content,当中甚至会有table嵌套,p多重嵌套,等乱七八糟的情况。此外,提醒你一下,a标签中的文字,也不能替换,否则便会出现a中有a)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式