文字列にURLが含まれていたら削除する - PHPプロ!Q&A掲示板

2604

  • 0P

文字列にURLが含まれていたら削除する

質問日時 / 2010年3月8日 10:08    回答数 / 5件

Questioner:  kanade  このエントリーをはてなブックマークに追加 

キーワード / キーワードが設定されていません

先日URLの削除について
先日も質問させて頂いたのですが
やりたいことが変わりまして文字列にURLが含まれていたら削除するという処理をしたいです。
コロコロ変わってしまい申し訳御座いません。

$string = 'てすとhttp://www.47news.jp/CN/201003/CN2010030801000031.htmlてすと';
$string = preg_replace('/^(http?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)$/','',$string);
※間違えております・・・。

こんな感じにすると「てすとてすと」という文字列に変換するようにしたいのですが
期待通りの結果になりません。
ご教授願えないでしょうか?

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01magicflute2この意見は投稿者によって削除されました。
┣A02shimix多分「php 自動リンク」あたりで検索すると、たくさん
┃┗A02-1kanadeご回答ありがとうございます。 URLを削除することが
┃ ┗A02-1-1shimix>imgタグなどでURLを指定している場合なども消してし
┗A03kanadeご回答ありがとうございます。 本当にURLだけを削除
 ┗A03-1shimix>本当にURLだけを削除したいです。 >画像指定などのC

回答一覧

並び替え:

A01
answerermagicflute2 [3月8日 11:15] (最終編集:3月8日 11:27)

この意見は投稿者によって削除されました。

ツリーへ TOPへ

A02
answerershimix [3月8日 11:38]

多分「php 自動リンク」あたりで検索すると、たくさんサンプルが出てくると思います。

置換文字列を(自動リンク用文字列でなく)空にしてしまえばいいだけなので、修正はそれほど面倒じゃないと思いますけど・・。

(例)
  1. $pat = '(https?|ftp)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)'; // 検出パターン
  2. $rep  = ''; // 置換パターン
  3. $str = eregi_replace($pat, $rep, $str);

この意見に回答する

ツリーへ TOPへ

A02-1
replyerkanade [3月9日 08:32]

ご回答ありがとうございます。
URLを削除することが出来ました。
但し問題が御座いましてimgタグなどでURLを指定している場合なども消してしまっているみたいです。
これはしょうがないのでしょうか?

この意見に回答する

ツリーへ TOPへ

A02-1-1
replyershimix [3月9日 09:04] (最終編集:3月9日 09:08)

>imgタグなどでURLを指定している場合なども消してしまっているみたいです。

「文字列にURLが含まれていたら削除する」という仕様であれば当然そうなりますね。

>これはしょうがないのでしょうか? 

たとえば先行する文字列が「="」もしくは「='」だったら対象外にする・・などでしょうか。いずれにしても先に仕様を確定させてください。HTMLソースであれば同様なケースはimg要素(のsrc属性)だけではないハズですから。anchor要素のhref属性とかCSSでの背景画像の記述などもありますよね。

#どういうものを対象にするか(どういうものを対象外にするか)は『仕様』ということになります。

極端な話、先行する文字が「"」「'」を対象外にするだけで済むかもしれません(が、普通に文字列中で引用符で括っているケースがないとも限りませんよね)。


なお、一般的に「後出しで条件を出されるのが大嫌い」という方が多いと思います(私もそうです)。注意してください。

この意見に回答する

ツリーへ TOPへ

A03
answererkanade [3月10日 05:13]

ご回答ありがとうございます。
本当にURLだけを削除したいです。
画像指定などのCSSやimgタグのURLは削除したくありません。

この意見に回答する

ツリーへ TOPへ

A03-1
replyershimix [3月10日 17:48]

>本当にURLだけを削除したいです。
>画像指定などのCSSやimgタグのURLは削除したくありません。

最初から「文字列」などと書かずに「HTMLソース」と書いていただけると早かったかもしれません。また「何を対象外にするか」は、ちゃんと明文化しておかないとあとあと困ると思います。

#いずれにしても「URLだけを削除したい」意図はわかりませんが(汗

とりあえずsource.htmlを読み込んでoutput.htmlに書き出すようにしてみました(とんでもない考え違いをしているかもしれません)。diffでのソース比較が出来るエディタを使えば結果はわかるかと思います。

とりあえずhead要素内は何もしません。つまりDTDに含まれるURIやstyle要素に存在するURLは対象外にしています。またbody要素内で「<」と「>」で挟まれている範囲はそのままにしています。それ以外の部分についてのみ置換させます。
  1. <?php
  2. $pat = '(https?|ftp)(://[[:alnum:]\+\$\;\? \.%,!#~*/:@&=_-]+)';
  3. $rep  = '';
  4.  
  5. $html = file_get_contents('source.html');
  6.  
  7. $sep = stripos($html'<body');
  8. if ($sep === false) { die('incorrect source')}
  9.  
  10. $dest = substr($html0$sep);
  11. $html = substr($html$sepstrlen($html) - $sep);
  12.  
  13. if (substr_count($html'<') <> substr_count($html'>')) { die('incorrect source')}
  14.  
  15. $array = explode('<'$html);
  16. foreach ($array as $item) {
  17.   if ($item == '') { continue}
  18.   list($item1$item2) = explode('>'$item);
  19.   $dest .= '<' . $item1 . '>';
  20.   $dest .= eregi_replace($pat$rep$item2);
  21. }
  22. $fp = fopen('output.html''w');
  23. fputs($fp$dest);
  24. fclose($fp);
  25. ?>

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)