php正则替换怎么同时排除多个特定的标签?

比如有一段文本:

<p style="text-align: center;">
  <span style="font-size: medium;">
    <img class="goods_desc_img" src="http://www.test.dev/data/upload/article/201701/05/201701051138398638.jpg" alt="核桃树用什么树嫁接w.jpg" /></span>
</p>
<p>
  <span style="font-size: medium;">核
    <a class="news-in-link" href="http://www.test.dev/fenlei/10878_tao.html">桃树</a>,又名胡桃树、属胡桃科植物,品种分为野生山核桃和人工嫁接改良品种核桃。原产于中亚地带,中国各地均有种植,一般选择种植人工改良后的品种,因为改良后的品种要比野生的品种产量高,壳薄,俗称泡核桃。野生的壳厚、个大、油多等特点,吃起来较香,俗称铁核桃。
    <br /></span></p>
<p align="center">
  <span style="font-size: medium;">
    <img class="goods_desc_img" src="http://www.test.dev/data/upload/article/201701/05/201701051138394778.jpg" alt="核桃树用什么树嫁接c.jpg" /></span>
</p>
<p>
  <span style="font-size: medium;">
    <br />一般只有同科同属的植物,相互嫁接效果才好,例如:李树、桃数 橘子树都可以 作为嫁接植物。
    <br />嫁接
    <a class="news-in-link" href="http://www.test.dev/fenlei/10833_hetao.html">核桃树</a>最好的是:
    <br />1、实生核桃(核桃种子播种出的苗)
    <a class="news-in-link" href="http://www.test.dev/">苗木</a>嫁接。
    <br />2、胡桃科核桃楸属可嫁接,如常见的核桃楸(山核桃),但容易出现小脚现象(砧木细,嫁接口以上粗)。
    <br />3、胡桃科枫杨属(南方),也可嫁接
    <a href="http://www.haha.com">核桃</a>。
    <br />总之核桃属之间的不同树种嫁接最好,亲和力强、适应能力强、丰产效果好。
    <br /></span></p>
<p align="center">
  <span style="font-size: medium;">
    <img class="goods_desc_img" src="http://www.test.dev/data/upload/article/201701/05/201701051138383594.jpg" alt="核桃树用什么树嫁接.jpg" /></span>
</p>
<p>
  <span style="font-size: medium;">
    <br />嫁接完成,接芽上部保留3片复叶,剪掉上部枝梢;嫁接的芽片萌发出3-5公分,就应该剪掉接芽上部枝叶,促进接芽迅速萌发生长。其他未嫁接新稍适当控制生长,以便集中营养促进嫁接萌发的新稍健壮成熟。早实核桃嫁接当年形成花芽,第二年正常结果。</span></p>

我想替换里面的一个独立的文本中的关键词“核桃”为一个链接,同时要排除a标签或img的alt中的文本等可能出现“核桃”的地方,排除一个好办,但同时排除多个好像比较麻烦,哪位有比较好的解决方案?

下面是我的只过滤非a标签里的代码,但如果图片的alt里有还是会出问题。

$article['content'] = preg_replace('/(?!<a .*?>.*?)核桃(?![^<]*<\/a>)/i','<a href="'.$link.'" class="news-in-link">核桃</a>',$article['content'],1);
阅读 4.1k
2 个回答

想到一个办法。
我们先匹配出我们不需要修改的内容。也就是a标签。将a标签全部取出并换成不重复的占位符,例如 A:01, 然后我们全局替换我们要换的。替换后再用我们之前取出来的A标签数组来循环将占位符替换回真实的A标签内容。题主你说我是不是机智的Boy啊?:)

var str = '<p style="text-align: center;"><span style="font-size: medium;"><img class="goods_desc_img" src="http://www.test.dev/data/uplo... alt="核桃树用什么树嫁接w.jpg" /></span></p><p><span style="font-size: medium;">核桃树,又名胡桃树、属胡桃科植物,品种分为野生山核桃和人工嫁接改良品种核桃。原产于中亚地带,中国各地均有种植,一般选择种植人工改良后的品种,因为改良后的品种要比野生的品种产量高,壳薄,俗称泡核桃。野生的壳厚、个大、油多等特点,吃起来较香,俗称铁核桃。
</span></p><p align="center"><span style="font-size: medium;"><img class="goods_desc_img" src="http://www.test.dev/data/uplo... alt="核桃树用什么树嫁接c.jpg" /></span></p><p><span style="font-size: medium;">
一般只有同科同属的植物,相互嫁接效果才好,例如:李树、桃数 橘子树都可以 作为嫁接植物。
嫁接核桃树最好的是:
1、实生核桃(核桃种子播种出的苗)苗木嫁接。
2、胡桃科核桃楸属可嫁接,如常见的核桃楸(山核桃),但容易出现小脚现象(砧木细,嫁接口以上粗)。
3、胡桃科枫杨属(南方),也可嫁接核桃
总之核桃属之间的不同树种嫁接最好,亲和力强、适应能力强、丰产效果好。
</span></p><p align="center"><span style="font-size: medium;"><img class="goods_desc_img" src="http://www.test.dev/data/uplo... alt="核桃树用什么树嫁接.jpg" /></span></p><p><span style="font-size: medium;">
嫁接完成,接芽上部保留3片复叶,剪掉上部枝梢;嫁接的芽片萌发出3-5公分,就应该剪掉接芽上部枝叶,促进接芽迅速萌发生长。其他未嫁接新稍适当控制生长,以便集中营养促进嫁接萌发的新稍健壮成熟。早实核桃嫁接当年形成花芽,第二年正常结果。</span></p>';

    // var matchArray = str.match(/(\>|\/\>)[^\>\<]{1,}?(\<|\<\/)/g);
    var matchArray = str.match(/(?!(<.*?)|(<a .*?>.*?))核桃(?!([^><]*?\/+>)|[^<]*<\/a>)/gi);
    str = str.replace(/(?!(<.*?)|(<a .*?>.*?))核桃(?!([^><]*?\/+>)|[^<]*<\/a>)/gi, "djjjjjjjjj");
    console.log(matchArray);
    console.log(str);
    

    

clipboard.png

推荐问题
宣传栏