替换标签但不替换标签之间的所有内容

时间:2016-12-12 08:03:03

标签: php regex preg-replace

假设我有一个很长的字符串,我想删除一个"< a>"标签,这是我已经尝试过的:

// kill rangeselector object (this is not cleared by dygraph)
delete dchart.rangeSelector_;
// update
dchart.updateOptions({ 
    // showRangeSelector: FULLVERSION,
    // or whatever settings you want
});
// resize so redraw is forced
// instead of #chart put #whatever-your-div-id-is
var cur_width = $("#chart").width();
var cur_height = $("#chart").height();
// instead of dchart put the variable name of your chart
// in a lot of the examples this is g
dchart.resize(10, 10);
dchart.resize(cur_width, cur_height);

正如您在此行中所看到的,它会从第一个"<<<一个"到满足条件的那个。

如何重写它只搜索一个开头并关闭一个标签?

换句话说,为了使自己清楚:我有一个很长的文本可能会或可能没有很多"<一个"标签。我需要删除任何包含特定字符串的内容。此字符串是动态创建的。使用上面的代码,我告诉程序搜索"<一个"并删除所有内容,直到找到$ aString,然后到结束" a>"标签不是我想要的。我希望它只删除包含$ aString的标记。

UPDATE :一个简单的str_replace不会做这个伎俩,因为它失败了" [\ s \ S] ?"实现这一点,为什么我把" [\ s \ S] ?"那里。正如我所说,标签内的文本包含$ aString,我的意思是:它可能是:

$text= preg_replace('~<a[\s\S]*?'.$aString.'[\s\S]*?/a>~','',$text);

<a class='blah' style='blah' $aString title='blah'>blahblahblah</a>

<a class='notblah' style='notblah' $aString>blah</a>

1 个答案:

答案 0 :(得分:0)

  

'~<a[\s\S]*?'.$aString.'[\s\S]*?/a>~'
  我该如何重写它,使其仅在一个打开和关闭标签内搜索?

负超前 assertion可以使<a…被匹配,因此匹配中不包含其他<a。您可以将子模式<a[\s\S]*?替换为<a((?!<a)[\s\S])*?。 同样,您可以通过设置modifier s PCRE_DOTALL )并将[\s\S]更改为.来简化表达式。

$text = preg_replace('~<a((?!<a).)*?'.$aString.'.*?/a>~s', '', $text);