質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

1回答

320閲覧

正規表現で指定タグを取得する

yyyyykkkkk

総合スコア11

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2018/02/20 13:46

実現したい事
→xmlファイルからAタグを取得し、target=“_blank”を付与する

はじめにDOMを使用して、getelementbytagNameでaタグを取得し、target=“_blank”が無ければ付与するという条件で処理を行っておりました。
しかし、DOMを使用する事で、他のタグがなくなってしまうなどの影響が出てしまった為、正規表現で同じ処理を行いたいと考えております。

ここで、いまいちどの様に処理を書けば良いかが分かりません。
$a = preg_mach(('/<a .?>(.?)</a>/', $text);
でAタグを取得し、
if($val->target==“”){
$val->target=“_blank”};
のような処理なのではと考えましたが、取得が出来ていません。

ネットでもテラテイルでも調べましたが、同じ内容が無かった為、質問をさせて頂きました。
プログラミングがわかっていないと言われるのはごもっともですが、
ご教授頂ける方にどうぞ宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

文字列で処理するなら考え方としてはチェックするのは
「<a\s」ではじまる文字列の「>」までの間だけでよいでしょう。

あとは条件次第

  • targetがないものは付加するだけ
  • targetがあるものはどうする?targetをはずして新たに_blankをつける?
  • targetがある場合の例外はどこまで対応する必要があるか

たとえば、

HTML

1<a href="hoge.htm" data-dummy="target='_blank'">hoge</a>

のようなものが文字列でのチェックだと引っかかる
また、既存のtargetが

<a href="fuga.htm" TarGet = '_BlanK' data-hoge="fuga<fuga>fuga">fuga</a>

のように大文字小文字混じりだったり、スペースがはいっていたり
本来小文字指定の「_blank」が不適当な大文字化していたり
本来のタグ終端子である「>」が途中で文字列として出現したり
どこまでフォローすべきかです。
そういうの煩わしさを防ぐのがDOMとしての処理です

sample

文字列での検証は例外が多すぎるためかなり困難であることはすでにお伝えしたとおりですが
逆に言えば極端に変なタグ設定をしていなければ以下で大丈夫だとおもいます

  • まずはaタグを拾う
  • aタグの中身を検証して書き換える

PHP

1<?PHP 2$str=<<<eof 3(1)test<a href="hoge.htm">hoge1</a>test<br> 4(2)test<a href="hoge.htm" target="fuga">hoge2</a>test<br> 5(3)test<a href="hoge.htm" data-target="fuga">hoge3</a>test<br> 6(4)test<a class="hoge target" href="hoge.htm">hoge4</a>test<br> 7eof; 8 9$pattern1="/(?<=<a\s).*?(?=>)/"; 10$replacement=function($x){ 11 $ret=$x[0]; 12 if(!preg_match("/(?<=\s)target/i",$x[0],$m)){ 13 $ret.=' target="_blank"'; 14 } 15 return $ret; 16}; 17$str=preg_replace_callback($pattern1,$replacement,$str); 18print "<pre>"; 19print htmlspecialchars($str); 20print "</pre>";

※上記(4)はNGです

追記

よくよく考えたら正規表現でaタグをひろったあと
callbackの中でdom処理をしてもいいかもしれません

PHP

1$str=<<<eof 2(1)test<a href="hoge.htm">hoge1</a>test<br> 3(2)test<a href="hoge.htm" target="fuga">hoge2</a>test<br> 4(3)test<a href="hoge.htm" data-target="fuga">hoge3</a>test<br> 5(4)test<a class="hoge target" href="hoge.htm">hoge4</a>test<br> 6eof; 7 8$pattern="/<a\s.*?</a>/"; 9$replacement=function($x){ 10 $doc=new DOMDocument(); 11 $doc->loadHTML($x[0]); 12 $node=$doc->getElementsByTagName("a")[0]; 13 $target=$node->getAttribute("target"); 14 if(empty($target)) $node->setAttribute("target","_blank"); 15 return $doc->saveXML($node); 16}; 17$str=preg_replace_callback($pattern,$replacement,$str); 18print "<pre>"; 19print htmlspecialchars($str); 20print "</pre>";

投稿2018/02/20 14:12

編集2018/02/21 01:41
yambejp

総合スコア114775

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yyyyykkkkk

2018/02/20 14:41

回答ありがとうございます。 条件は既存でtargetがあれば、そのままで、もし無ければ、新たに追加するという処理を行いたいです。
yyyyykkkkk

2018/02/20 22:38

以下のコードでaタグの生成が出来ました。 現在、生成したAタグの配列をどのよつに元のhtmlに戻すか奮闘しております。また別の枠で質問させて頂ければと思います。 $a = preg_mach(('/<a .*?>(.*?)</a>/', $text); foreach($a as $val){ if($val->target==“”){ $b = $val->target=“_blank”};
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問