アシアル株式会社主催 開発者向け、一歩先をいくためのテクニカルセミナー

<< Apache2.2.14が起動しません 質問一覧 インクルードファイルの優先順位 >>
  • キーワードが設定されていません

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

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

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

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

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

Q文字列にURLが含まれていたら削除する kanade  [03月08日 10時08分] 
┣(削除済み)
┣Re:文字列にURLが含まれていたら削除する shimix  [03月08日 11時38分] 
┃┗Re:Re:文字列にURLが含まれていたら削除する kanade  [03月09日 08時32分] 
┃  ┗Re:Re:Re:文字列にURLが含まれていたら削除する shimix  [03月09日 09時04分] 
┗Re:文字列にURLが含まれていたら削除する kanade  [03月10日 05時13分] 
  ┗Re:Re:文字列にURLが含まれていたら削除する shimix  [03月10日 17時48分] 

コメント一覧

並び替え( ツリー順 / 投稿順[降順] / 投稿順[昇順]

(削除済み)

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

>本当に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. ?>
Apache2.2.14が起動しません 質問一覧 インクルードファイルの優先順位