回答編集履歴

1

追記

2016/09/22 09:19

投稿

popobot
popobot

スコア6586

test CHANGED
@@ -47,3 +47,67 @@
47
47
  ```
48
48
 
49
49
  多くの場合、大丈夫だと思いますが、より厳密にやりたければHTML解析(DomDocument等)して置き換える方法もあります。
50
+
51
+
52
+
53
+ ---
54
+
55
+
56
+
57
+ **追記**
58
+
59
+
60
+
61
+ 上記の2パターンのpreg_replaceだと、内部的には2回走査する気がしています。
62
+
63
+ なので、preg_replace_callbackを使って1パターンでできないか試してみましたのが以下のコードです。
64
+
65
+ 一応うまく行っていますが、input内にtypeとclassのどちらかしかない場合に対応していません。
66
+
67
+ 頑張ればできますが、これ以上複雑になるとバグがないか確認するのが難しくなってくるのでやめました...
68
+
69
+ 個人的には、多少処理が重くても、わかりやすい実装を好むので、2パターンのpreg_replaceを使うのがおすすめです
70
+
71
+
72
+
73
+ ```php
74
+
75
+ <?php
76
+
77
+ $input = <<<EOT
78
+
79
+ <input type="text" name="your_name" class="short" />
80
+
81
+ <input type="text" name="your_email" class="middle" />
82
+
83
+ EOT;
84
+
85
+
86
+
87
+ $result = preg_replace_callback(
88
+
89
+ '/(<input.*)(type|class)(\s*=)(.*)(type|class)(\s*=)(.*)(\/>)/',
90
+
91
+ function ($matches) {
92
+
93
+ $replaces = array('type' => 'title', 'class' => 'id');
94
+
95
+ return $matches[1]
96
+
97
+ .$replaces[$matches[2]].$matches[3].$matches[4]
98
+
99
+ .$replaces[$matches[5]].$matches[6].$matches[7]
100
+
101
+ .$matches[8];
102
+
103
+ },
104
+
105
+ $input
106
+
107
+ );
108
+
109
+
110
+
111
+ var_dump($result);
112
+
113
+ ```