回答編集履歴

1

追記

2018/03/06 04:25

投稿

yambejp
yambejp

スコア115010

test CHANGED
@@ -11,3 +11,103 @@
11
11
  正規表現の文字列解釈には限界があります
12
12
 
13
13
  きちんと文法解釈してやるならDOMでやらないと難しいでしょう
14
+
15
+
16
+
17
+ # 追記
18
+
19
+
20
+
21
+ 以前書いたのとさほど変わらないような気がしますが
22
+
23
+ 命題がちょっとちがうようなのでこれでどうでしょう?
24
+
25
+ この手の処理はcallbackで二段階に処理をするのが楽です
26
+
27
+
28
+
29
+ 考え方:
30
+
31
+ - aタグを拾って
32
+
33
+ - targetがついてたらはずし
34
+
35
+ - target="_blank"を無条件につける
36
+
37
+
38
+
39
+ ```PHP
40
+
41
+ $str=<<<eof
42
+
43
+ <p class="hoge">
44
+
45
+  <a href="hogehoge">
46
+
47
+  ほげ
48
+
49
+  </a>
50
+
51
+ </p>
52
+
53
+ <p class="hoge">
54
+
55
+  <a>
56
+
57
+  ほげ
58
+
59
+  </a>
60
+
61
+ </p>
62
+
63
+ <p class="hoge">
64
+
65
+  <a href="hogehoge" target="fugafuga">
66
+
67
+  ほげ
68
+
69
+  </a>
70
+
71
+ </p>
72
+
73
+ <p class="hoge">
74
+
75
+  <a href="hogehoge" target="_blank">
76
+
77
+  ほげ
78
+
79
+  </a>
80
+
81
+ </p>
82
+
83
+
84
+
85
+ eof;
86
+
87
+ $pattern="/(?<=<a)\s*.*?(?=>)/";
88
+
89
+ $replacement=function($x){
90
+
91
+ $str=$x[0];
92
+
93
+ $pattern="/(\s*target\s*=s*([\"']))(.+?)(\2)/";
94
+
95
+ $str=preg_replace($pattern,"",$str);
96
+
97
+ return $str." target=\"_blank\"";
98
+
99
+ };
100
+
101
+ $str=preg_replace_callback($pattern,$replacement,$str);
102
+
103
+
104
+
105
+ print "<pre>";
106
+
107
+ print htmlspecialchars($str);
108
+
109
+ ```
110
+
111
+
112
+
113
+ 上記以外でもしうまく動かないケースがあれば具体的に例示してください