回答編集履歴

3

ちょうせい

2021/07/16 03:59

投稿

yambejp
yambejp

スコア114883

test CHANGED
@@ -92,7 +92,7 @@
92
92
 
93
93
  $a=$doc->createElement('a');
94
94
 
95
- $a->setAttribute("href",urlencode($url));
95
+ $a->setAttribute("href",$url);
96
96
 
97
97
  $a->textContent=$keyword;
98
98
 

2

sample

2021/07/16 03:59

投稿

yambejp
yambejp

スコア114883

test CHANGED
@@ -9,3 +9,123 @@
9
9
  のようなタグ内の属性として与えられる可能性もあるので
10
10
 
11
11
  PHPでやるならDOMDocumentで処理してください
12
+
13
+
14
+
15
+ # sample
16
+
17
+ ```PHP
18
+
19
+ <form>
20
+
21
+ キーワード:<input name="keyword"><br>
22
+
23
+ URL:<input name="url" value="#url2"><br>
24
+
25
+ <input type="submit" value="send"><br>
26
+
27
+ </form>
28
+
29
+ <hr>
30
+
31
+ <?PHP
32
+
33
+ mb_internal_encoding("UTF-8");
34
+
35
+ $html=<<<eof
36
+
37
+ <p>木曾路はすべて山の中である。</p>
38
+
39
+
40
+
41
+ <p>あるところは岨づたいに行く崖の道であり、
42
+
43
+ あるところは<a href="#url1" target="_blank">数十間の深さに臨む木曾川の岸</a>であり、
44
+
45
+ あるところは山の尾をめぐる谷の入り口である。</p>
46
+
47
+
48
+
49
+ <p>一筋の街道はこの深い森林地帯を貫いていた。東ざかいの桜沢から、
50
+
51
+ 西の十曲峠まで、<a href="#url1">木曾</a>十一宿はこの街道に添うて、
52
+
53
+ 二十二里余にわたる長い谿谷の間に散在していた。
54
+
55
+ <a href="#url1">道路</a>の位置も幾たびか改まったもので、
56
+
57
+ 古道はいつのまにか深い山間に埋もれた。</p>
58
+
59
+ eof;
60
+
61
+ $keyword=filter_input(INPUT_GET,"keyword");
62
+
63
+ $pattern="/".preg_quote($keyword,"/")."/";
64
+
65
+ $url=filter_input(INPUT_GET,"url");
66
+
67
+
68
+
69
+ $doc=new DOMDocument();
70
+
71
+ $doc->loadHTML("<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />\n".$html);
72
+
73
+ $body=$doc->getElementsByTagName("body")[0];
74
+
75
+ if($keyword){
76
+
77
+ foreach($body->getElementsByTagName("*") as $nodes){
78
+
79
+ for($i=$nodes->childNodes->length-1;$i>=0;$i--){
80
+
81
+ $node=$nodes->childNodes[$i];
82
+
83
+ if($node->nodeType=="3" and $node->parentNode->tagName!=="a" and preg_match($pattern,$node->nodeValue)){
84
+
85
+ $v=$node->nodeValue;
86
+
87
+ $newElements=[];
88
+
89
+ foreach(preg_split($pattern,$v) as $key=>$n){
90
+
91
+ if($key>0){
92
+
93
+ $a=$doc->createElement('a');
94
+
95
+ $a->setAttribute("href",urlencode($url));
96
+
97
+ $a->textContent=$keyword;
98
+
99
+ $newElements[]=$a;
100
+
101
+ }
102
+
103
+ $t=$doc->createTextNode($n);
104
+
105
+ $newElements[]=$t;
106
+
107
+ }
108
+
109
+ foreach($newElements as $n){
110
+
111
+ $node->parentNode->insertBefore($n,$node);
112
+
113
+ }
114
+
115
+ $node->parentNode->removeChild($node);
116
+
117
+ }
118
+
119
+ }
120
+
121
+ }
122
+
123
+ }
124
+
125
+ foreach($body->childNodes as $node){
126
+
127
+ print $doc->saveHTML($node);
128
+
129
+ }
130
+
131
+ ```

1

ちょうせい

2021/07/16 03:55

投稿

yambejp
yambejp

スコア114883

test CHANGED
@@ -1 +1,11 @@
1
+ たとえば
2
+
3
+ ```html
4
+
5
+ <img src="・・・" alt="木曾">
6
+
7
+ ```
8
+
9
+ のようなタグ内の属性として与えられる可能性もあるので
10
+
1
11
  PHPでやるならDOMDocumentで処理してください