命題の条件がよくわかりません。
pタグの中のaタグ(テキストが「ほげ」)のaタグを抜くというのは
からのpタグにすればいいのでしょうか?
それともpタグに「ほげ」が入っていればいいのでしょうか?
正規表現の文字列解釈には限界があります
きちんと文法解釈してやるならDOMでやらないと難しいでしょう
追記
以前書いたのとさほど変わらないような気がしますが
命題がちょっとちがうようなのでこれでどうでしょう?
この手の処理はcallbackで二段階に処理をするのが楽です
考え方:
- aタグを拾って
- targetがついてたらはずし
- target="_blank"を無条件につける
PHP
1$str=<<<eof
2<p class="hoge">
3 <a href="hogehoge">
4 ほげ
5 </a>
6</p>
7<p class="hoge">
8 <a>
9 ほげ
10 </a>
11</p>
12<p class="hoge">
13 <a href="hogehoge" target="fugafuga">
14 ほげ
15 </a>
16</p>
17<p class="hoge">
18 <a href="hogehoge" target="_blank">
19 ほげ
20 </a>
21</p>
22
23eof;
24$pattern="/(?<=<a)\s*.*?(?=>)/";
25$replacement=function($x){
26 $str=$x[0];
27 $pattern="/(\s*target\s*=s*([\"']))(.+?)(\2)/";
28 $str=preg_replace($pattern,"",$str);
29 return $str." target=\"_blank\"";
30};
31$str=preg_replace_callback($pattern,$replacement,$str);
32
33print "<pre>";
34print htmlspecialchars($str);
上記以外でもしうまく動かないケースがあれば具体的に例示してください